c# - Nest SuggestCompletion用法,抛出 'is not a completion suggest field'异常

标签 c# elasticsearch nest

我是 elasticsearch 的完全初学者,我一直在尝试使用 elasticsearch 的完成建议器使用 Nest 自动完成属性。

这是我的映射(如前所述 here : ):

  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] is not a completion suggest field]。查询如下所示:

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();

我在这里做错了什么,我查看了 Nest 在 SuggestCompletion 上的测试但帮助不大,这意味着测试仅描述了如何获得建议,而没有描述如何为 SuggestCompletion 设置索引映射。

我也试过设置 edgeNgram post 中提到的分词器但是,也无法继续进行。

关于如何进行的任何指导或示例都会有很大帮助。

最佳答案

更新

您尝试创建一个名称为“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>()在上次通话之后。

关于c# - Nest SuggestCompletion用法,抛出 'is not a completion suggest field'异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21433586/

相关文章:

c# - 本地化在 Chrome 中不起作用

c# - 返回带有模型和查询字符串的 View

c# - NEST 批量插入后等待服务器完成索引

c# - 如何使用组合框更改 richTextBox 字体大小

elasticsearch - 如何在Logstash中处理JSON

java - 如何将 Jest SearchResult 命中转换到域对象

php - Symfony2 Elastica bundle (elasticsearch)-可能仅限制 'active'项目?

c# - 使用 Nest Elastic 根据术语中的单词数进行搜索

c# - 有什么方法可以将JSON查询转换为Elasticsearch Nest搜索查询吗?

c# - 在没有往返的情况下更新 Entity Framework 6