gpt4 book ai didi

elasticsearch - 当某些字段并不总是存在时,不确定如何正确过滤

转载 作者:行者123 更新时间:2023-12-02 22:16:11 26 4
gpt4 key购买 nike

我正在尝试根据某些对象上不存在的字段进行过滤。我的印象是 ES 会匹配没有该字段的对象。

最终,我尝试这样过滤:

  • 字段 A 将始终存在,并且应与任何标签 1、2、3 匹配
  • 如果存在,字段 B 或 C 必须与标签 5、6、7 中的任意一个匹配
  • 如果存在,字段 B 必须与标签 10、11、12 中的任意一个匹配
  • 如果存在,字段 B 或 C 不得包含任何标签 15、16、18。

在这种情况下,我的所有标签都是字符串。此外,字段 B 和 C 位于另一个字段之内。我不确定这是否重要。

本质上,我的目标是:

{ a: ["some", "tags", "here"],
X : {
B: ["more", "tags", "here"],
C: ["even", "more", "here"]
}
}

我正在尝试从本质上构建一个白名单和黑名单过滤系统。

但是,以这种方式过滤时,我没有得到任何不包含该字段的结果。

如何正确设置此过滤器的格式?

最佳答案

Elasticsearch 将 null 或不存在的字段视为与该字段上的查询/过滤器不匹配,因此标准查询/过滤器不会返回这些结果。但是,如果我理解正确的话,可以设置一个查询来完成您想要的任务。您可以组合使用“or”“not”“exist” 过滤器。我将通过几个例子向您展示基本思想。

首先,创建一个索引并添加一些文档,各个文档中缺少各个字段:

curl -XPUT "http://localhost:9200/test_index"

curl -XPUT "http://localhost:9200/test_index/docs/1" -d'
{
"a": ["some", "tags", "here"],
"X" : {
"B": ["more", "tags", "here"],
"C": ["even", "more", "here"]
}
}'

curl -XPUT "http://localhost:9200/test_index/docs/2" -d'
{
"a": ["some", "tags", "here"]
}'

curl -XPUT "http://localhost:9200/test_index/docs/3" -d'
{
"a": ["some", "tags", "here"],
"X" : {
"B": ["more", "tags", "here"]
}
}'

curl -XPUT "http://localhost:9200/test_index/docs/4" -d'
{
"a": ["some", "tags", "here"],
"X" : {
"C": ["even", "more", "here"]
}
}'

如果我想检索包含字段“X.B”(具有任何值)的文档,我可以使用以下查询:

curl -XPOST "http://localhost:9200/test_index/docs/_search" -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"exists": {
"field": "X.B"
}
}
}
}
}'

这将返回文档 "1""3"

另一方面,如果我只想返回不包含字段 "X.B" 的文档,那么我可以使用以下查询:

curl -XPOST "http://localhost:9200/test_index/docs/_search" -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"exists": {
"field": "X.B"
}
}
}
}
}
}
}'

这将返回文档 "2""4"

现在,如果我想返回没有字段 "X.B" 的文档,或者该字段与术语 "here" 匹配,您可以使用“或”过滤如下:

curl -XPOST "http://localhost:9200/test_index/docs/_search" -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"or": [
{
"term": { "X.B" : "here" }
},
{
"not": {
"filter": {
"exists": {
"field": "X.B"
}
}
}
}
]
}
}
}
}'

在这种情况下,将返回所有四个文档,因为它们都匹配两个可能的条件之一。

这并不能完全满足您的用例,但应该足以让您入门。

这是一个您可以使用的可运行示例(您需要安装 ES 并在 localhost:9200 运行,或提供另一个端点): http://sense.qbox.io/gist/f1a644db97c89996f2b44f49793a2c76bae3155c

关于elasticsearch - 当某些字段并不总是存在时,不确定如何正确过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21005516/

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