ElasticSearch 比较范围结果
ElasticSearch comparative range results
你好,我想索引看起来像那样的对象
{
uuid: "123",
clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{ order: 3, uuid: "789"}]
}
有没有办法编写一个查询来匹配包含的所有对象
带有 uuid: "345" 和 uuid: "789" 的子句,但第二个的顺序最多比第一个大两倍?
所以上面的例子会匹配但下一个不会匹配:
{
uuid: "999",
clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{order: 3, uuid: "777"},{ order: 4, uuid: "789"}]
}
原因是“789”子句的阶数为4,比“345”子句的阶数为1大2倍以上。
感谢任何帮助!
谢谢,
迈克尔
实现此目的的一种方法是使用 script
filter。
我使用的脚本如下:
def idxs = [];
for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {
if (matches.contains(doc['clauses.uuid'].values[i])){
idxs << i
}
};
def orders = idxs.collect{ doc['clauses.order'].values[it]};
return orders[1] - orders[0] <= 2
基本上,我所做的是首先收集 matches
数组中包含 uuid
的子句的所有索引(即 345 和 789)。
然后,根据我得到的索引,我收集了这些索引处的所有 order
值。最后,我检查第二个 order
减去第一个 order
是否不大于 2.
POST your_index/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"clauses.uuid": "345"
}
},
{
"term": {
"clauses.uuid": "789"
}
},
{
"script": {
"script": "def idxs = []; for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {if (matches.contains(doc['clauses.uuid'].values[i])){idxs << i}}; def orders = idxs.collect{doc['clauses.order'].values[it]}; return orders[1] - orders[0] <= 2",
"params": {
"matches": [
"345",
"789"
]
}
}
}
]
}
}
}
这将 return 只有第一个文档而不是第二个文档。
你好,我想索引看起来像那样的对象
{
uuid: "123",
clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{ order: 3, uuid: "789"}]
}
有没有办法编写一个查询来匹配包含的所有对象 带有 uuid: "345" 和 uuid: "789" 的子句,但第二个的顺序最多比第一个大两倍?
所以上面的例子会匹配但下一个不会匹配:
{
uuid: "999",
clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{order: 3, uuid: "777"},{ order: 4, uuid: "789"}]
}
原因是“789”子句的阶数为4,比“345”子句的阶数为1大2倍以上。
感谢任何帮助! 谢谢, 迈克尔
实现此目的的一种方法是使用 script
filter。
我使用的脚本如下:
def idxs = [];
for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {
if (matches.contains(doc['clauses.uuid'].values[i])){
idxs << i
}
};
def orders = idxs.collect{ doc['clauses.order'].values[it]};
return orders[1] - orders[0] <= 2
基本上,我所做的是首先收集 matches
数组中包含 uuid
的子句的所有索引(即 345 和 789)。
然后,根据我得到的索引,我收集了这些索引处的所有 order
值。最后,我检查第二个 order
减去第一个 order
是否不大于 2.
POST your_index/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"clauses.uuid": "345"
}
},
{
"term": {
"clauses.uuid": "789"
}
},
{
"script": {
"script": "def idxs = []; for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {if (matches.contains(doc['clauses.uuid'].values[i])){idxs << i}}; def orders = idxs.collect{doc['clauses.order'].values[it]}; return orders[1] - orders[0] <= 2",
"params": {
"matches": [
"345",
"789"
]
}
}
}
]
}
}
}
这将 return 只有第一个文档而不是第二个文档。