如何实施Elasticsearch建议者?

如何解决如何实施Elasticsearch建议者?

我正在尝试实现一个示例代码,该示例代码使用Elastic Search中的建议功能

索引文档由一个平面POCO组成

public class CandidateDocument
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string FirstName { get; set; }
    public DateTime BirthDate { get; set; }
    public CompletionField Suggest { get; set; }
}

映射如下

var client = new Elasticclient(settings);

client.Indices.Create("candidates",c =>
                                           c.Map<CandidateDocument>(m =>
                                                            m.Properties(ps => ps.Text(s => s.Name(n => n.Name)
                                                                                             .Store(false)
                                                                                             .Fields(f => f.Keyword(k => k.Name("nameRaw"))))
                                                                                 .Text(s => s.Name(n => n.FirstName)
                                                                                             .Store(false)
                                                                                             .Fields(f => f.Keyword(k => k.Name("firstNameRaw"))
                                                                                 
                                                                                 .Date(s => s.Name(n => n.BirthDate).Format("ddMMyyyy"))
                                                                                 .Keyword(s => s.Name(n => n.Id))))
                                                                               
                                                                                 .Completion(c => c.Name(n => n.Suggest)))));

索引文档的外观如下:

 var candidateDocument = new CandidateDocument
        {
            Id = Guid.NewGuid(),Name = "Lennon",FirstName = "John",BirthDate = DateTime.Now,Suggest = new CompletionField
            {
                Input = new[] { "Lennon" },}
        };

    var indexResponse = await this.elasticclient.IndexAsync(candidateDocument,i => i.Index("candidates"));

我的查询是:

var searchResponse = await this.elasticclient.SearchAsync<CandidateDocument>(s => s.Index("candidates").Suggest(su => su
                                                                                                       .Completion("suggestions",c => c
                                                                                                                                        .Field(f => f.Suggest)
                                                                                                                                        .Prefix(query)
                                                                                                                                        .Fuzzy(f => f.Fuzziness(Fuzziness.Auto))
                                                                                                                                        .Size(5))));

我正面临以下问题:

Elasticsearch.Net.ElasticsearchClientException:请求执行失败。呼叫:状态代码400,发自:POST / candidates / _search?typed_keys = true。 ServerError:类型:search_phase_execution_exception原因:“所有分片均失败” CausedBy:“类型:invalid_argument_exception原因:“未为字段[suggest]找到映射”“ CausedBy:“类型:非法_argument_exception原因:“未为字段[suggest]找到映射”” >

使用kibana查看我的索引映射:

      "suggest": {
      "properties": {
        "input": {
          "type": "text","fields": {
            "keyword": {
              "type": "keyword","ignore_above": 256
            }
          }
        }
      }
    }

通过这种方式,我在.NET Core 3.1中使用最新版本的nest(7.9.0)

感谢您的帮助。

解决方法

有同样的问题,通过显式映射解决:

_elasticClient.Indices.Create("candidates",c => c
 .Map<CandidateDocument>(m => m
     .Properties(ps => ps
         .Completion(s => s
             .Name(n => n.Suggest)))));

public class CandidateDocument
{        
    public Guid? Id { get; set; }
    public CompletionField Suggest { get; set; }
}
,

看起来像候选索引,并且在发出带有映射请求的创建索引时,建议字段可能已经存在。您可以检查返回的CreateIndexResponse,以查看是否为这种情况; IsValid属性为false,响应中的错误详细信息将说明原因。

Elasticsearch的默认行为是在索引请求进入时将创建索引和映射,以将文档编入索引,并根据它看到的第一个文档推断字段的映射。这对于许多用例来说都是有用的行为,但是对于搜索用例,您通常希望在执行操作时使用显式映射来控制索引的创建,因此可以通过设置action.auto_create_index cluster setting to false.来关闭此行为。现在,如果您删除索引并使用创建索引请求再次重新创建,则在有机会明确创建索引之前,将不会自动创建该索引。

,

是的,在为未根据我描述的映射定义创建的文档建立索引的同时,创建了映射定义。 如预期的那样,检查CreateIndexResponse IsValid属性可指示问题。

我花了一些时间找出根本问题:我使用的是ES Docker映像版本6.3.0和Nest Client 7. *。 使我的ES与Nest客户端兼容可以解决此问题。

谢谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?