[ "tag-1", "tag-2", "tag-3",-6ren">
gpt4 book ai didi

Elasticsearch 数组 must 和 must_not

转载 作者:行者123 更新时间:2023-11-29 02:45:27 24 4
gpt4 key购买 nike

我的 elasticsearch 数据库中有一个看起来像这样的文档:

{
"tags" => [
"tag-1",
"tag-2",
"tag-3",
"tag-A"
]
"created_at" =>"2013-07-02 12:42:19 UTC",
"label" =>"Mon super label"
}

我希望能够使用以下条件过滤我的文档:文档标签数组必须包含 tags-1、tags-3 和 tags-2,但不能包含 tags-A。

我尝试使用 bool 过滤器,但无法让它工作!

最佳答案

这是一个似乎可以完成您想要的方法:http://sense.qbox.io/gist/4dd806936f12a9668d61ce63f39cb2c284512443

首先,我创建了一个具有显式映射的索引。我这样做是为了将 "tags" 属性设置为 "index": "not_analyzed"。这意味着不会以任何方式修改文本,这将简化此示例的查询过程。

curl -XPUT "http://localhost:9200/test_index" -d'
{
"mappings": {
"docs" : {
"properties": {
"tags" : {
"type": "string",
"index": "not_analyzed"
},
"label" : {
"type": "string"
}
}
}
}
}'

然后添加一些文档:

curl -XPUT "http://localhost:9200/test_index/docs/1" -d'
{
"tags" : [
"tag-1",
"tag-2",
"tag-3",
"tag-A"
],
"label" : "item 1"
}'
curl -XPUT "http://localhost:9200/test_index/docs/2" -d'
{
"tags" : [
"tag-1",
"tag-2",
"tag-3"
],
"label" : "item 2"
}'
curl -XPUT "http://localhost:9200/test_index/docs/3" -d'
{
"tags" : [
"tag-1",
"tag-2"
],
"label" : "item 3"
}'

然后我们可以在 bool 过滤器中使用 mustmust_not 子句进行查询,如下所示:

curl -XPOST "http://localhost:9200/test_index/_search" -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"tags": [
"tag-1",
"tag-2",
"tag-3"
],
"execution" : "and"
}
}
],
"must_not": [
{
"term": {
"tags": "tag-A"
}
}
]
}
}
}
}
}'

产生正确的结果:

{
"took": 3,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "docs",
"_id": "2",
"_score": 1,
"_source": {
"tags": [
"tag-1",
"tag-2",
"tag-3"
],
"label": "item 2"
}
}
]
}
}

请注意 must 子句中的 terms 过滤器中的 "execution": "and" 参数。这意味着只有指定了所有 “标签” 的文档才会被返回(而不是匹配一个或多个的文档)。那可能就是您所缺少的。您可以在 ES docs 中阅读有关选项的更多信息.

我做了一个可运行的例子here如果您在 localhost:9200 上安装并运行了 ES,您可以使用它,或者您可以提供自己的端点。

关于Elasticsearch 数组 must 和 must_not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168375/

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