【发布时间】:2015-09-11 11:32:26
【问题描述】:
我在完全理解我尝试使用 java API (v1.7.1) 构建的 elasticsearch 查询的行为时遇到了一些麻烦。下面是最初的SearchRequestBuilder;
SearchRequestBuilder builder = client.prepareSearch("my_index")
.setTypes("my_document_type")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
我有一组带有title 和content 字段的索引文档。当我尝试像这样匹配 title 字段中的短语时;
builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword));
当然还有;
SearchResponse response = builder.execute().actionGet();
此查询的行为完全符合我的预期 - 我的搜索根据 title 字段的内容返回高度相关的结果 - 到目前为止一切顺利。
但是,当我尝试向构建器添加另一个查询时;
builder.setQuery(QueryBuilders.matchQuery("content", keyword));
我原来的非常相关的结果(基于标题内容)现在更难理解了。例如,搜索短语(关键字)“这是一个测试”将返回该短语逐字存在的文档(在标题中)——就像我说的那样,完美。然而,第二个查询的添加现在使那些以前相关的文档完全从结果中删除 - 无处可寻。即使相同的文本与以前相同的字段匹配。显然我做错了什么,我只是不明白什么 - 或如何实现将关键字与title 和content 匹配并返回相关结果的期望行为,这意味着如果有一个非常接近的短语匹配title 我希望看到这些文件得分更高。我也试过提升没有效果;
builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword).boost(5.0f));
builder.setQuery(QueryBuilders.matchQuery("content", keyword));
任何帮助将不胜感激。
【问题讨论】:
标签: java elasticsearch