gpt4 book ai didi

elasticsearch - ElasticSearch比较范围结果

转载 作者:行者123 更新时间:2023-12-03 01:56:38 25 4
gpt4 key购买 nike

嗨,我想索引看起来像这样的对象

{
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”子句的顺序大2,后者比“345”子句的顺序大1。

任何帮助表示赞赏!
谢谢,
米歇尔

最佳答案

实现此目的的一种方法涉及使用 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

基本上,我正在做的是首先收集子句的所有索引,这些子句在 uuid数组中包含 matches(即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"
]
}
}
}
]
}
}
}

那将仅返回第一个文档,而不返回第二个。

关于elasticsearch - ElasticSearch比较范围结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com