1 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
重新索引解決方案:
我最近從 ElasticSearch 找到了這個(gè)文檔: https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html
由于倒排索引,TermQuery 和 TermsQuery 或 ElasticSearch 通常都使用“必須包含”而不是“必須等于”。
根據(jù)他們的說法,最好的解決方案是:
如果您確實(shí)想要這種行為——整個(gè)字段相等——實(shí)現(xiàn)它的最好方法是索引一個(gè)輔助字段。在此字段中,您索引字段包含的值的數(shù)量。使用我們之前的兩個(gè)文檔。將計(jì)數(shù)信息編入索引后,您可以構(gòu)建一個(gè) constant_score 來強(qiáng)制執(zhí)行適當(dāng)數(shù)量的術(shù)語。https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html#_equals_exactly
步驟如下:
在名為 exgroups_count 的索引中添加額外的映射。
使用 logstash 計(jì)算 exgroups 數(shù)組長(zhǎng)度并放入 exgroups_count 字段。
保存索引。
沒有重新索引的另一個(gè)解決方案:
添加和重新索引整個(gè)事物有一些限制。一旦您的索引增長(zhǎng),向索引添加字段和計(jì)算計(jì)數(shù)將是非常具有侵入性的 - 使其操作非常密集 - 更不用說您必須保存和維護(hù)您的映射。
我找到了一個(gè)不需要重新索引的解決方案。查看 ScriptQueryBuilder,理論上我可以添加一個(gè)腳本過濾器來計(jì)算數(shù)組的長(zhǎng)度并等于 1。
"filter" : {
"script" : {
"script" : "doc['exgroups'].values.length == 1"
}
}
所以完整的查詢現(xiàn)在變成這樣:
"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);
添加回答
舉報(bào)