首页 > 解决方案 > 如何使用正则表达式在elasticsearch中通过match_phrase查询搜索子对象的值字段

问题描述

Elasticseach 中层次结构的文档如下

"hierarchy":{
        "username":"Nothing on",
        "Location":"",
        "Owner":"unknown",
        "works": "IT"
        
    }

是否有任何方法可以使用层次结构中的任何字段搜索值,层次结构中的字段是动态的,并尝试使用正则表达式模式匹配并出现错误。

我们不能像 hierarchy.works、hierarchy.Owner等那样指定。因为层次结构中的字段是动态的并且也使用了转义字符串,但它也会给出错误。

{
        "from": 0,
        "query": {
            "multi_match": {
                "query": "IT",
                "type": "phrase_prefix",
                "fields": [
                    "number",
                    "name",
                    "address",
                    "hierarchy.*.",
                    "tags"
                ],
            }
        }
    }

标签: elasticsearch

解决方案


如果未提供任何字段,则 multi_match 查询默认为 index.query.default_field 索引设置,而后者又默认为 *。这将提取映射中符合术语查询条件的所有字段并过滤元数据字段。然后组合所有提取的字段以构建查询。

由于该hierarchy字段是动态的,因此您无法指定要查询的字段,因此查询查询的一种方法是在field参数中不添加任何字段。

索引数据1:

{
  "hierarchy": {
    "username": "Nothing on",
    "Location": "",
    "Owner": "unknown",
    "works": "IT",
    "education":"btech"
  }
}

索引数据2:

{
  "hierarchy": {
    "username": "Nothing on",
    "Location": "",
    "Owner": "unknown",
    "works": "IT"
  }
}

搜索查询:

{
  "query": {
    "multi_match": {
      "query": "btech",
      "type": "phrase_prefix"
    }
  }
}

搜索结果:

 "hits": [
      {
        "_index": "64467424",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.2876821,
        "_source": {
          "hierarchy": {
            "username": "Nothing on",
            "Location": "",
            "Owner": "unknown",
            "works": "IT",
            "education": "btech"
          }
        }
      }
    ]

编辑1:

您可以使用 query_string 查询创建包含通配符、跨多个字段的搜索等的复杂搜索。虽然通用,但查询很严格,如果查询字符串包含任何无效语法,则会返回错误。

{
  "query": {
    "query_string": {
      "fields": [
        "number",
        "name",
        "address",
        "hierarchy*",
        "tags"
      ],
      "query": "btech"
    }
  }
}

推荐阅读