Search code examples
elasticsearchelasticsearch-queryelasticsearch-nested

elastic search match query over array object


Suppose i've 3 doc

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"
    ]
}

Here citedIn field is a array object.Now i want run a stander match query

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

}

The above query return all of the 3 doc, but it suppose to return doc_3 as only doc_3 contain Contract, act and 15 together in a single array element .

How would i achieve this ?

Any suggestion/Solution would be preferable

Nested Data Type Update :

i did try nested field. This Is my mapping

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

This is my data

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"}
    ]
}

This is my query

{
    "query":
    {

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

But still getting same result


Solution

  • Adding a working example with index data, mapping,search query, and search result.

    You need to use nested query to search on nested fields

    Index Mapping

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

    Index Data:

     {
            "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"
                }
            ]
        }
    

    Search Query:

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

    Search Result:

    "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"
                      }
                    }
                  ]
                }
              }
            }
          }