use*_*544 10 filtering elasticsearch
我的弹性搜索数据库中有这样的文档:
{
"tags" => [
"tag-1",
"tag-2",
"tag-3",
"tag-A"
]
"created_at" =>"2013-07-02 12:42:19 UTC",
"label" =>"Mon super label"
}
Run Code Online (Sandbox Code Playgroud)
我希望能够使用以下标准过滤我的文档:文档标签数组必须包含标签-1,标签-3和标签-2,但不能包含标签-A.
我试图使用bool过滤器,但我无法使其工作!
Slo*_*ens 15
这是一个似乎可以达到你想要的方法: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"
}
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
然后添加一些文档:
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"
}'
Run Code Online (Sandbox Code Playgroud)
然后我们可以在过滤器中查询using must和must_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"
}
}
]
}
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
这会产生正确的结果:
{
"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"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
请注意子句中过滤器中的"execution" : "and"参数.这意味着只返回具有所有指定的文档(而不是那些匹配一个或多个的文档).那可能是你错过的.您可以在ES文档中阅读有关选项的更多信息.termsmust"tags"
我在这里做了一个可运行的例子,你可以玩,如果你已经安装并运行了ES localhost:9200,或者你可以提供自己的端点.
| 归档时间: |
|
| 查看次数: |
20633 次 |
| 最近记录: |