首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch完成-按分数返回前10名文档

Elasticsearch完成-按分数返回前10名文档
EN

Stack Overflow用户
提问于 2015-03-12 13:41:06
回答 1查看 1K关注 0票数 3

我正在使用Elasticsearch和自动完成的完成类型。对于一个空搜索,我想在整个映射中返回前十位文档(按分数)。

我的映射就是这样创建的:

代码语言:javascript
复制
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“。

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

代码语言:javascript
复制
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)时,我使用建议调用,而不是搜索(完形建议者)。我称之为:

代码语言:javascript
复制
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,但不返回任何选项。
  • 没有提供要提示的文本,但这会在响应中抛出一个NullPointerException。
  • 使用搜索而不是建议,但由于权重不是映射的字段之一,所以我无法按其排序(错误:“没有找到用于keyword_suggest.weight的映射以便对其排序”)。默认排序是输出的字母顺序。

我要所有文档的前10名结果在完成映射,按他们的分数排序。

EN

回答 1

Stack Overflow用户

发布于 2015-03-12 13:54:57

由于您只有一个空字符串,因此无法计算完成提示器的得分。在这种情况下得分是没有意义的。

将所有文档进行匹配并根据权重进行排序,您可以根据权重获得10个最高的文档。

代码语言:javascript
复制
POST my_type/_search
{
    "sort":{"suggest_field_name.weight": {"order": "desc"}}
}

由于当输入字段为空时,结果可能总是相同的,所以可以在应用程序中缓存顶级结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29011381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档