ElasticSearch查询特定术语,而不是其他术语

时间:2015-09-17 13:50:20

标签: java elasticsearch

当我查询一个术语(标准分析器)时,我得到一个按分数排序的结果列表。这很好。但是在打电话时:

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我似乎也失败了 - 除了我发现一些评论认为否定查询不起作用。

所以基本上,我正在寻找一个查询特定术语的查询,同时过滤/否定提升包含其他单词的结果。
如果可能的话,我现在应该远离脚本(糟糕的经历)。

所以查询:必须/不应包含与单词

不同的单词

1 个答案:

答案 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:

  

执行扫描结果,执行搜索而不进行任何排序。它会自动开始滚动结果集