当我查询一个术语(标准分析器)时,我得到一个按分数排序的结果列表。这很好。但是在打电话时:
QueryBuilders.termQuery(fieldname, word);
我得到了一个混合物:
word
some word
WORD
word and such
没有特别排序,因为所有得分都相同,因为它们都包含word
。由于结果数量在0到100之间变化,我需要先进行最精确的匹配(或其他过滤)
我尝试添加based on ES regex filter,但看起来它们没有被处理:
FilterBuilders.regexQuery(fieldname, "~"+word).flag(RegexpFlag.ALL);
FilterBuilders.regexQuery(fieldname, "^((?!" + word+").)*$".flag(RegexpFlag.ALL);// and this
FilterBuilders.regexQuery(fieldname, "^\\(\\(\\?!" + word+"\\)\\.\\)*$".flag(RegexpFlag.ALL);// or
我也尝试了QueryBuilders.boostingQuery
我似乎也失败了 - 除了我发现一些评论认为否定查询不起作用。
所以基本上,我正在寻找一个查询特定术语的查询,同时过滤/否定提升包含其他单词的结果。
如果可能的话,我现在应该远离脚本(糟糕的经历)。
所以查询:必须/不应包含与单词
不同的单词答案 0 :(得分:0)
事实上,最简单的查询集是:
final int fetchAmount = 100; // number of items to return
final FilterBuilder filterBuilder = FilterBuilders.termFilter(fieldname, word);
final QueryBuilder combinedQuery = QueryBuilders.termQuery(fieldname, word);
final QueryBuilder queryBuilder = QueryBuilders.filteredQuery(combinedQuery, filterBuilder);
final SearchResponse builder = CLIENT.prepareSearch(index_name).setQuery(queryBuilder).setExplain(true)
.setTypes(type_name).setSize(fetchAmount).setSearchType(SearchType.QUERY_THEN_FETCH).execute().actionGet();
廉价地使用FilterBuilder
来丢弃不包含word
的值。对TermQuery
使用相同的查询(QueryBuilder
)将导致评分机制。从第一个得分SearchHit.score()
,然后继续,直到找到score < firstScore
的一个
如上所述,当使用TermQuery
QueryBuilder
代替QueryBuilders.matchAllQuery()
时,会出现问题。在后一种情况下将返回相同的结果集,但不应用评分(因此没有排序)机制。
保持setSize
相对较低,出于速度目的,当最后一项仍有意义时,再次调用上述查询,然后添加setFrom(fetchAmount )
以便第二个查询将从第一个查询开始一个停了,像:
final int xthQueryCalledTime = 1; // if using a loop
final SearchResponse builder = CLIENT.prepareSearch(index_name).setQuery(queryBuilder).setExplain(true)
.setTypes(type_name).setSize(fetchAmount).setSearchType(SearchType.QUERY_THEN_FETCH).setFrom(fetchAmount * xthQueryCalledTime).execute().actionGet();
直到完成。
聚苯乙烯。不要使用滚动!这将混淆分数排序。来自SearchType.SCAN上的JavaDoc:
执行扫描结果,执行搜索而不进行任何排序。它会自动开始滚动结果集