【问题标题】:Elasticsearch Completion - Return top 10 docs by scoreElasticsearch Completion - 按分数返回前 10 个文档
【发布时间】:2015-05-14 16:54:11
【问题描述】:

我正在使用 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) 时,我使用 suggest 调用,而不是搜索 (Completion Suggesters)。我称之为:

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

这非常适合带有文本的建议,但不适用于空白建议。

在我尝试过的尝试中:

  • 将空字符串 ("") 分配给 searchTermLC,但返回 no 选项。
  • 不提供建议的文本,但会引发 响应中出现 NullPointerException。
  • 使用搜索而不是建议,但由于权重不是映射的字段之一,我无法对其进行排序(错误:“未找到 [keyword_suggest.weight] 的映射以便排序”)。输出的默认排序是按字母顺序排列的。

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

【问题讨论】:

  • 你找到解决方案了吗?目前正在寻找类似的东西

标签: java autocomplete elasticsearch autosuggest


【解决方案1】:

由于您只有一个空字符串,因此无法为完成建议器计算分数。在这种情况下得分确实没有意义。

匹配所有文档并根据权重排序,可以得到权重最高的十个文档。

POST my_type/_search
{
    "sort":{"suggest_field_name.weight": {"order": "desc"}}
}

由于输入字段为空时结果可能始终相同,因此您可以在应用程序中缓存排名靠前的结果。

【讨论】:

  • 使用空字符串我不是在寻找分数,而且我不认为 _suggest 调用无论如何都使用分数,它通过树结构匹配。搜索是我的第二次尝试,但正如我所说,我得到“没有找到 [keyword_suggest.weight] 的映射以便排序”。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多