我正在使用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();这对于有文本的建议来说是完美的,但对于空白的建议则不是这样。
在我的尝试中,我尝试过:
我要所有文档的前10名结果在完成映射,按他们的分数排序。
发布于 2015-03-12 13:54:57
由于您只有一个空字符串,因此无法计算完成提示器的得分。在这种情况下得分是没有意义的。
将所有文档进行匹配并根据权重进行排序,您可以根据权重获得10个最高的文档。
POST my_type/_search
{
"sort":{"suggest_field_name.weight": {"order": "desc"}}
}由于当输入字段为空时,结果可能总是相同的,所以可以在应用程序中缓存顶级结果。
https://stackoverflow.com/questions/29011381
复制相似问题