Home > Enterprise >  Does Elasticsearch support nested or object fields in MultiMatch?
Does Elasticsearch support nested or object fields in MultiMatch?

Time:03-24

I have some object field named "FullTitleFts". It has field "text" inside. This query works fine (and returns some entries):

GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fullTitleFts.text": "Ivan"
          }
        }
      ]
    }
  }
}

But this query returns nothing:

GET index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "Ivan",
            "fields": [
              "fullTitleFts.text"
            ]
          }
        }
      ]
    }
  }
}

Mapping of the field:

"fullTitleFts": {
    "copy_to": [
        "text"
    ],
    "type": "keyword",
    "fields": {
        "text": {
            "analyzer": "analyzer",
            "term_vector": "with_positions_offsets_payloads",
            "type": "text"
        }
    }
}


"analyzer": {
    "filter": [
        "lowercase",
        "hypocorisms",
        "protect_kw"
    ],
    "char_filter": [
        "replace_char_filter",
        "e_char_filter"
    ],
    "expand": "true",
    "type": "custom",
    "tokenizer": "standard"
}  

e_char_filter is for replacing Cyrillic char "ё" to "е", replace_char_filter is for removing "�" from text. protect_kw is keyword_marker for some Russian unions. hypocorisms is synonym_graph for making another forms of names.

Example of analyzer output:

GET index/_analyze
{
  "analyzer": "analyzer",
  "text":     "Алёна�"
}

{
  "tokens" : [
    {
      "token" : "аленка",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "аленушка",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "алена",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

I've also found this question. And it seems that the answer didn't really work - author had to add "include_in_root" option in mapping. So i wondering if multi match supports nested or object fields at all. I am also can't find anything about it in docs.

CodePudding user response:

As you have provided index mapping, your field is defined as multi-field and not as nested or object field. So both match and multi_match should work without providing path. you can just use field name as fullTitleFts.text when need to search on text type and fullTitleFts when need to search on keyword type.

  • Related