当前位置: 首页 > 面试题库 >

Nest RecommendationCompletion用法,引发“不是完成建议字段”异常

罗兴运
2023-03-14
问题内容

我是Elasticsearch的完整入门者,我一直在尝试使用Elasticsearch的完成建议程序,该建议程序使用Nest来自动完成属性。

这是我的映射(如此处提及:):

  var createResult = client.CreateIndex(indexName, index => index                
            .AddMapping<Contact>(tmd => tmd
                .Properties(props => props
                    .Completion(s =>
                        s.Name(p => p.CompanyName.Suffix("completion"))
                        .IndexAnalyzer("standard")
                        .SearchAnalyzer("standard")
                        .MaxInputLength(20)
                        .Payloads()
                        .PreservePositionIncrements()
                        .PreserveSeparators())                        
                )
            )
        );
var resultPerson = client.IndexMany(documents.OfType<Person>(), new SimpleBulkParameters { Refresh = true });
var resultCompany = client.IndexMany(documents.OfType<Company>(), new SimpleBulkParameters { Refresh = true });

在建立索引的过程中,我只是使用IndexMany方法并传递IEnumberable<Contact>(Contact具有一个名为CompanyName的属性,Contact是一个抽象类,Person和Company都是其具体实现)。搜索抛出异常,
表明ElasticSearchException [Field [companyName]不是完成建议字段] 。查询如下所示:

SearchDescriptor<Contact> descriptor = new SearchDescriptor<Contact>();
descriptor = descriptor.SuggestCompletion("suggest", c => c.OnField(f => f.CompanyName).Text(q));

var result = getElasticClientInstance("contacts").Search<Contact>(body => descriptor);

string qe = result.ConnectionStatus.ToString();

我在这里做错了什么,我SuggestCompletion只看了Nest的测试,但没有太多帮助,这意味着该测试仅描述了如何获取建议,而没有说明如何为RecommendationCompletion设置索引映射。

我也尝试设立edgeNgram在此提到的标记生成器后,但是,不能进行有作为。

关于如何进行的任何方向或示例都将大有帮助。


问题答案:

更新

您尝试创建一个名称为“ companyName.completion”的属性,但是在该位置该属性无效,它将使用最后一个标记“completion”。因此,它实际上映射了一个称为完成的字段…。尝试将调用更改为:.Name(p => p.CompanyName)

其他观察

您可以为,Contact但在建立索引时使用PersonCompany类型。

用您映射的Elasticsearch术语:

/index/contact/

但您的文档将进入:

/index/person//index/company

NEST不会自动映射特定类的所有实现,elasticsearch无法知道这三个类之间的关系。

我会重构到方法的映射,并为所有涉及的类型调用它。

 var createResult = client.CreateIndex(indexName, index => index                
      .AddMapping<Contact>(tmd => MapContactCompletionFields(tmd))
      .AddMapping<Person>(tmd => MapContactCompletionFields(tmd))
      .AddMapping<Company>(tmd => MapContactCompletionFields(tmd))   
  );

 private RootObjectMappingDescriptor<TContact>  MapContactCompletionFields<TContact>(
      RootObjectMappingDescriptor<TContact> tmd)
      where TContact : Contact
 {
      return  tmd.Properties(props => props
           .Completion(s => s
                .Name(p => p.CompanyName.Suffix("completion"))
                .IndexAnalyzer("standard")
                .SearchAnalyzer("standard")
                .MaxInputLength(20)
                .Payloads()
                .PreservePositionIncrements()
                .PreserveSeparators()
           )                        
       );
 }

该方法返回描述符,因此您可以进一步对其进行链接。

然后,当您搜索联系人时:

var result = getElasticClientInstance("contacts").Search<Contact>(
    body => descriptor
        .Types(typeof(Person), typeof(Company))
);

该类型提示将导致搜索/index/person/index/company并且将知道如何向您返回文档的协变列表。

因此,您可以result.Documents.OfType<Person>()在上一个呼叫之后执行。



 类似资料:
  • 在弹性搜索中,我将记录存储在命名空间和主题中。这些是简单的对象,只有(string)和。 我想通过自动完成搜索名称,为此我试图使用索引搜索。 ElasticSearch::Transport::Transport::Transport::Errors::BadRequest:[400]{“error”:{“root_cause”:[{“type”:“illegal_argument_excepti

  • 我想从多个领域得到建议。我找不到这样的例子,所以也许这不是最好的主意,但我对你的意见很感兴趣。 要求是: GET查询适用于文本“fyodor”和“dostoevsky”,此示例仅适用于“fyodor” 启用筛选建议 我有什么想法可以实现这些?

  • 问题内容: 我在Elasticsearch中使用“完成建议程序”来允许部分单词匹配查询。在我的索引(products_index)中,我希望能够同时查询 product_name 字段和 brand 字段。这是我的映射: 这是我的数据: 这是我的查询: 效果很好,除了我想给 product_name 字段赋予比 brand 字段更高的权重。有什么办法可以实现?我已经研究了有关使用 布尔 查询的文章

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本

  • 我试图在IntelliJ中使用ctrl空格键快捷方式来完成代码,但每次我这样做时,它都返回“没有建议”。 这是我的项目目录,即使我键入starter然后按ctrl空格键,即使文件存在于项目目录中,也没有“建议”: 我根据这个线程尝试了以下操作(Intellij IDEA CE 12 Android XML代码完成不起作用): > 转到文件- 转到首选项- 转到文件- 我做错了什么?

  • 有时,当Tomcat已经运行了一段时间并且我终止了嵌入的Tomcat(Ctrl c)时,应用程序会引发以下异常: <代码>2019-10-17 10:23:10.704信息20020---[线程3]o.s.b.f.支持。DisposableBeanAdapter:在名为“entityManagerFactory”的bean上调用destroy方法失败:java。lang.BootstrapMeth