Elasticsearch自动完成 - 按得分返回前10个文档

3

我是使用 Elasticsearch 和自动完成类型来实现自动补全功能。对于空搜索,我希望返回整个映射中排名前十的文档(按得分排序)。

我的映射创建如下:

String type = AutoCompleteServiceImpl.AC_TYPE;

XContentBuilder mapping = jsonBuilder()
        .startObject()
          .startObject(type)
            .startObject("properties")
              .startObject(AutoCompleteServiceImpl.AC_FIELD)
                .field("type", "completion")
              .endObject()
            .endObject()
          .endObject()
        .endObject();

PutMappingResponse mappingResponse = 
  client.admin().indices().preparePutMapping(index)
  .setType(type).setSource(mapping)
  .execute().actionGet();

当 AC_FIELD = "keyword_suggest" 时。

我通过以下方式添加文档:

XContentBuilder json =  jsonBuilder()
        .startObject()
          .startObject(AC_FIELD)
            .array("input", record.getInput().toArray(new String[1]))
            .field("output", record.getOutput())
            .field("weight", record.getWeight())
          .endObject()
        .endObject();

elasticsearch.getClient()
    .prepareIndex(elasticsearch.getIndexName(), AC_TYPE, record.getId())
    .setSource(json)
    .execute().actionGet();

当用户输入文本(searchTermLC)时,我使用建议调用而不是搜索(完成建议者)。我会这样调用:
CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder(AC_TYPE);
suggestionsBuilder.field(AC_FIELD);
suggestionsBuilder.text(searchTermLC);
if (limit != null)
  suggestionsBuilder.size(limit);

SuggestResponse response =  
      elasticsearch.getClient()
        .prepareSuggest(elasticsearch.getIndexName())
        .addSuggestion(suggestionsBuilder)
        .execute().actionGet();

这对于带有文本的建议完美地工作,但是对于空建议则不是这样。
在我的尝试中,我尝试了以下措施:
  • 将搜索术语LC分配为空字符串(""),但没有返回任何选项。
  • 不提供要建议的文本,但响应中抛出NullPointerException。
  • 使用搜索而不是建议,但由于权重不是映射字段之一,因此无法按其进行排序(错误:“未找到[keyword_suggest.weight]的映射以便进行排序”)。默认排序是输出的字母顺序。

我想要完成映射中所有文档的前10个结果,并按其得分排序。

你找到这个问题的解决方案了吗?目前正在寻找类似的东西。 - John
1个回答

1
由于您只有一个空字符串,无法为完成建议者计算得分。在这种情况下进行评分确实没有意义。
匹配所有文档并基于权重排序,您可以获得根据权重排序的前十个文档。
POST my_type/_search
{
    "sort":{"suggest_field_name.weight": {"order": "desc"}}
}

当输入字段为空时,结果可能始终相同,因此您可以在应用程序中缓存顶部结果。


使用空字符串时,我不需要得分,并且我认为_suggest调用也不会使用得分,它是通过树结构进行匹配的。搜索是我的第二次尝试,但正如我所说,我得到了“未找到[关键字_suggest.weight]的映射,以便进行排序”。 - Whiskee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接