如何解决数组对象上的弹性搜索匹配查询
假设我有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_3
,Contract
和act
一起返回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,尤其是下图所示的最后一个重要说明:
如上图所示,数组中的所有字符串实际上都是同一字段的一部分,因此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"
}
}
]
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。