首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组中的ElasticSearch匹配组合

数组中的ElasticSearch匹配组合
EN

Stack Overflow用户
提问于 2015-02-27 12:20:20
回答 1查看 1.6K关注 0票数 0

我正在使用来自ElasticSearch的php包将ElasticSearch实现到Laravel应用程序中。

我的应用程序是一个小型jobboard,目前我的工作文档如下:

代码语言:javascript
运行
复制
{  
   "_index":"jobs",
   "_type":"job",
   "_id":"19",
   "_score":1,
   "_source":{  
      "0":"",
      "name":"Programmer",
      "description":"This is my first job! :)",
      "text":"Programming is awesome",
      "networks":[  
         {  
            "id":1,
            "status":"PRODUCTION",
            "start":"2015-02-26",
            "end":"2015-02-26"
         },
         {  
            "id":2,
            "status":"PAUSE",
            "start":"2015-02-26",
            "end":"2015-02-26"
         }
      ]
   }
}

如您所见,一个作业可以附加到多个网络。在我的搜索查询中,我想包括WHERE network.id == 1 AND network.status == PRODUCTION.

我当前的查询如下所示,但是如果它有任何状态产生网络,则返回具有id 1网络的文档。无论如何,我是否可以在一个网络中强制两者都是真呢?

代码语言:javascript
运行
复制
$query = [
            'index' => $this->index,
            'type' => $this->type,
            'body' => [
                'query' => [
                    'bool' => [
                        'must' => [
                            ['networks.id' => 1]],
                            ['networks.status' => 'PRODUCTION']]
                        ],
                        'should' => [
                            ['match' => ['name' => $query]],
                            ['match' => ['text' => $query]],
                            ['match' => ['description' => $query]],
                        ],
                    ],
                ],
            ],
        ];
EN

Stack Overflow用户

回答已采纳

发布于 2015-02-27 13:15:25

您需要指定networks数组中的对象应该作为单独的对象存储在索引中,这将允许您对单个network对象执行搜索。您可以使用Elasticsearch中的嵌套型来做到这一点。

此外,如果执行精确匹配,最好使用筛选器而不是查询,因为筛选器是缓存的,并且总是比查询提供更好的性能。

使用新的映射创建索引。对nested数组使用networks类型。

代码语言:javascript
运行
复制
POST /test
{
    "mappings": {
        "job": {
            "properties": {
                "networks": {
                    "type": "nested",
                    "properties": {
                        "status": {
                            "type": "string",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

增加一份文件:

代码语言:javascript
运行
复制
POST /test/job/1
{
    "0": "",
    "name": "Programmer",
    "description": "This is my first job! :)",
    "text": "Programming is awesome",
    "networks": [
        {
            "id": 1,
            "status": "PRODUCTION",
            "start": "2015-02-26",
            "end": "2015-02-26"
        },
        {
            "id": 2,
            "status": "PAUSE",
            "start": "2015-02-26",
            "end": "2015-02-26"
        }
    ]
}

由于您有嵌套类型,因此需要使用嵌套筛选器。

代码语言:javascript
运行
复制
POST /test/job/_search
{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "nested": {
                    "path": "networks",
                    "filter": {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "networks.id": "1"
                                    }
                                },
                                {
                                    "term": {
                                        "networks.status.raw": "PRODUCTION"
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    }
}
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28764996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档