首页 > 解决方案 > 如何在elasticsearch中搜索字段数组

问题描述

我在弹性搜索中有一个名为professor

  1. 我需要搜索subject这是PhysicsAccounting这是字段数组(OR)语句
  2. 我需要搜索type的是Permanent(&) 条件
  3. 我需要搜索Location的是NY(&) 条件
  4. {'type':['Contract','Guest']} 类型也有可能作为列表出现
test = [{'id':1,'name': 'A','subject': ['Maths','Accounting'],'type':'Contract', 'Location':'NY'},
      { 'id':2,'name': 'AB','subject': ['Physics','Engineering'],'type':'Permanent','Location':'NY'},
    {'id':3,'name': 'ABC','subject': ['Maths','Engineering'],'type':'Permanent','Location':'NY'}]

查询如下,第三个得到它,如何添加1 and 2

content_search = es.search(index="professor", body={
    "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": [
        {
          "term": {
            "Location.keyword": "NY"
          }
        }
      ]
    }
  }
})
content_search ['hits']['hits']

预期出来的是 id[{ 'id':2,'name': 'AB','subject': ['Physics','Engineering'],'type':'Permanent','Location':'NY'}]

标签: elasticsearchdsl

解决方案


您需要使用bool 查询来包装所有条件

添加带有索引数据(与所讨论的相同)、搜索查询和搜索结果的工作示例

搜索查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "type.keyword": "Permanent"
          }
        },
        {
          "match": {
            "Location.keyword": "NY"
          }
        }
      ],
      "should": [
        {
          "match": {
            "subject.keyword": "Accounting"
          }
        },
        {
          "match": {
            "subject.keyword": "Physics"
          }
        }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "stof_64370980",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.8365774,
        "_source": {
          "id": 2,
          "name": "AB",
          "subject": [
            "Physics",
            "Engineering"
          ],
          "type": "Permanent",
          "Location": "NY"
        }
      }
    ]

推荐阅读