繁体   English   中英

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

[英]ElasticSearch query a specific term, not other terms

当我查询一个术语(标准分析器)时,我会得到一个按分数排序的结果列表。 哪个好。 但是在调用时:

QueryBuilders.termQuery(fieldname, word);

我得到了以下混合:

word
some word
WORD
word and such

没有特别的排序,因为所有分数都相同,因为它们都包含word 由于结果数量在 0 到 1M 之间变化,我需要首先进行最精确的匹配(或其他过滤器)。
我尝试基于 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 ,我似乎也失败了 - 除了我遇到一些负面查询不起作用的评论。

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

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

事实上,最简单的一组查询是:

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的值。 QueryBuilder使用相同的查询 ( TermQuery ) 将产生评分机制。 从第一个开始获取分数SearchHit.score() ,然后继续直到找到score < firstScorescore < firstScore
问题,如在问题所描述的,而不是使用时,会发生TermQueryQueryBuilder 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:

执行搜索结果的扫描,无需任何排序。 它将自动开始滚动结果集

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM