我是使用 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个结果,并按其得分排序。