【发布时间】: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