1 回答

TA貢獻1773條經驗 獲得超3個贊
重新索引解決方案:
我最近從 ElasticSearch 找到了這個文檔: https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html
由于倒排索引,TermQuery 和 TermsQuery 或 ElasticSearch 通常都使用“必須包含”而不是“必須等于”。
根據他們的說法,最好的解決方案是:
如果您確實想要這種行為——整個字段相等——實現它的最好方法是索引一個輔助字段。在此字段中,您索引字段包含的值的數量。使用我們之前的兩個文檔。將計數信息編入索引后,您可以構建一個 constant_score 來強制執行適當數量的術語。https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html#_equals_exactly
步驟如下:
在名為 exgroups_count 的索引中添加額外的映射。
使用 logstash 計算 exgroups 數組長度并放入 exgroups_count 字段。
保存索引。
沒有重新索引的另一個解決方案:
添加和重新索引整個事物有一些限制。一旦您的索引增長,向索引添加字段和計算計數將是非常具有侵入性的 - 使其操作非常密集 - 更不用說您必須保存和維護您的映射。
我找到了一個不需要重新索引的解決方案。查看 ScriptQueryBuilder,理論上我可以添加一個腳本過濾器來計算數組的長度并等于 1。
"filter" : {
"script" : {
"script" : "doc['exgroups'].values.length == 1"
}
}
所以完整的查詢現在變成這樣:
"bool" : {
"must" : [
{
"term" : {
"exgroups" : {
"value" : "TSX",
"boost" : 1.0
}
}
}
],
"filter" : [
{
"script" : {
"script" : {
"source" : "doc['exgroups'].values.length == 1",
"lang" : "painless"
},
"boost" : 1.0
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
在爪哇,
BoolQueryBuilder qBool = new BoolQueryBuilder();
TermQueryBuilder query = new TermQueryBuilder("exgroups", exchangeGroup.getCode());
qBool.must(query);
ScriptQueryBuilder sQuery = new ScriptQueryBuilder(new Script("doc['exgroups'].values.length == 1"));
qBool.filter(sQuery);
添加回答
舉報