Elasticsearch数组must和must_not

我的Elasticsearch DB中有一个像这样的文档:

{

"tags" => [

"tag-1",

"tag-2",

"tag-3",

"tag-A"

]

"created_at" =>"2013-07-02 12:42:19 UTC",

"label" =>"Mon super label"

}

我希望能够使用此条件过滤我的文档:Documents标签数组必须具有标签1,标签3和标签2,但不能具有标签A。

我尝试使用布尔过滤器,但无法使其正常工作!

回答:

这是一种似乎可以完成您想要的方法: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"

}'

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

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"

}

}

]

}

}

注意子句中过滤器中的"execution" :

"and"参数。这意味着将仅返回具有所有指定内容的文档(而不是与一个或多个匹配的文档)。那可能就是你所缺少的。您可以在ES文档中阅读有关选项的更多信息。terms``must``"tags"

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

以上是 Elasticsearch数组must和must_not 的全部内容, 来源链接: utcz.com/qa/436352.html

回到顶部