数组对象上的弹性搜索匹配查询

问题描述

假设我有3个文档

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

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

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

citedIn字段是一个数组对象。现在,我要运行标准match查询

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

}

上面的查询返回了所有3个文档,但是它假设仅在doc_3中包含doc_3Contractact一起返回15一个数组元素。

我将如何实现?

任何建议/解决方案都更可取

嵌套数据类型更新:

我确实尝试过嵌套字段。 这是我的映射

{
    "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"},1872 - Section 15"}
    ]
}

这是我的查询

{
    "query":
    {

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

但仍然得到相同的结果

解决方法

您无法实现此目标,因为您要索引的是citedIn字段中字符串的数组,并且默认情况下,所有Elasticsearch字段都是采用Lucene设计的多值形式,而elasticsearch是建立在Lucene search library之上的。

有关更多信息,请阅读arrays in elasticsearch,尤其是下图所示的最后一个重要说明:

enter image description here

如上图所示,数组中的所有字符串实际上都是同一字段的一部分,因此ES无法识别您的搜索字符串是否为数组中同一字符串的一部分 ,因此您可以在搜索中获取所有文档。

除非您将这些字符串作为nested字段之类的其他字段的一部分进行索引,但是为此您需要提供字段名称及其名称,就像地图一样,其中key是您的字段名称,value是字段值,并且您查询字段名称,将无法实现用例。

,

添加包含索引数据,映射,搜索查询和搜索结果的工作示例。

您需要使用nested query搜索嵌套字段

索引映射

{
    "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"
            },1872 - Section 55"
            }
        ]
    }
    {
        "citedIn": [
            {
                "someFiled": "15 C. B 400"
            },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"
                  }
                }
              ]
            }
          }
        }
      }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...