数组对象上的ElasticSearch匹配查询

kgsdhlau  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(354)

假设我有3个医生

doc_1 = {
    "citedIn": [
        "Bar Councils Act, 1926 - Section 15",
        "Contract Act, 1872 - Section 23"
    ]
}

doc_2 = {
    "citedIn":[
        "15 C. B 400", 
        "Contract Act, 1872 - Section 55"
    ]
}

doc_3 = {
    "citedIn":[
        "15 C. B 400", 
        "Contract Act, 1872 - Section 15"
    ]
}

在这里 citedIn 字段是数组对象。现在我要运行一个stander match 查询

{
    "query":
    {
        "match": {"citedIn":{"query": "Contract act 15" , "operator":"and" }}
    }

}

上面的查询返回了3个文档的全部内容,但它假设返回 doc_3 仅作为 doc_3 包含 Contract , act 以及 15 在单个数组元素中。
我该如何做到这一点?
最好有任何建议/解决方案
嵌套数据类型更新:
我试过嵌套字段。这是我的Map

{
    "mappings": {
        "properties": {
            "citedIn": {
                "type": "nested",
                "include_in_parent": true,
                "properties": {
                    "someFiled": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        }
    }
}

这是我的数据

doc_1 = {
    "citedIn": [
        {"someFiled" : "Bar Councils Act, 1926 - Section 15"},
        {"someFiled" : "Contract Act, 1872 - Section 23"}
    ]
}

doc_2 = {
    "citedIn":[
        {"someFiled" : "15 C. B 400"}
        {"someFiled" : "Contract Act, 1872 - Section 55"}
    ]
}

doc_3 = {
    "citedIn":[
        {"someFiled" : "15 C. B 400"},
        {"someFiled" : "Contract Act, 1872 - Section 15"}
    ]
}

这是我的问题

{
    "query":
    {

        "match": {"citedIn.someFiled":{"query": "Contract act 15" , "operator":"and" }}

    }
}

但仍然得到同样的结果

ar7v8xwq

ar7v8xwq1#

添加索引数据、Map、搜索查询和搜索结果的工作示例。
您需要使用嵌套查询来搜索嵌套字段
索引Map

{
    "mappings": {
        "properties": {
            "citedIn": {
                "type": "nested"
            }
        }
    }
}

索引数据:

{
        "citedIn": [
            {
                "someFiled": "Bar Councils Act, 1926 - Section 15"
            },
            {
                "someFiled": "Contract Act, 1872 - Section 23"
            }
        ]
    }
    {
        "citedIn": [
            {
                "someFiled": "15 C. B 400"
            },
            {
                "someFiled": "Contract Act, 1872 - Section 55"
            }
        ]
    }
    {
        "citedIn": [
            {
                "someFiled": "15 C. B 400"
            },
            {
                "someFiled": "Contract Act, 1872 - Section 15"
            }
        ]
    }

搜索查询:

{
    "query": {
        "nested": {
            "path": "citedIn",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "citedIn.someFiled": "contract"
                            }
                        },
                        {
                            "match": {
                                "citedIn.someFiled": "act"
                            }
                        },
                        {
                            "match": {
                                "citedIn.someFiled": 15
                            }
                        }
                    ]
                }
            },
            "inner_hits": {}
        }
    }
}

搜索结果:

"inner_hits": {
          "citedIn": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 1.620718,
              "hits": [
                {
                  "_index": "stof_64170705",
                  "_type": "_doc",
                  "_id": "3",
                  "_nested": {
                    "field": "citedIn",
                    "offset": 1
                  },
                  "_score": 1.620718,
                  "_source": {
                    "someFiled": "Contract Act, 1872 - Section 15"
                  }
                }
              ]
            }
          }
        }
      }
bbuxkriu

bbuxkriu2#

你没有办法做到这一点,因为你正在索引的是一个数组字符串在你的 citedIn 字段,因为所有elasticsearch字段都默认为多值字段,因为它是在lucene中以这种方式设计的,elasticsearch构建在lucene搜索库之上。
请阅读elasticsearch中的数组以获取更多信息,尤其是最后一个重要注解,如下图所示:

如上图所述,数组中的所有字符串实际上都是同一字段的一部分,因此es无法确定搜索字符串是否是数组中同一字符串的一部分,因此您将获得搜索中的所有文档。
除非将这些字符串作为其他字段的一部分进行索引,如 nested 字段,但为此您需要给出字段的名称,它就像一个Map,其中键是您的字段名,值是字段值,而不是查询字段名,您将无法实现您的用例。

相关问题