Выделить вложенный объект в Elastic search - PullRequest
0 голосов
/ 18 декабря 2018

Вот мой пример набора данных,

{
   "parent":[
      {
         "name":"John Doe 1",
         "age":"100 year",
         "sex":"male",
         "child":[
            {
               "name":"Jane Doe 1",
               "height":100.00,
               "width":100.00
            },
            {
               "name":"Jane Doe 2",
               "height":100.00,
               "width":100.00
            }
         ]
      },
      {
         "name":"John Doe 2",
         "age":"100 year",
         "sex":"male",
         "child":[
            {
               "name":"Jane Doe 3",
               "height":100.00,
               "width":100.00
            },
            {
               "name":"Jane Doe 4",
               "height":100.00,
               "width":100.00
            }
         ]
      }
   ]
}

И мое определение:

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "default": {
            "type": "simple"
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "parent": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "keyword"
            },
            "age": {
              "type": "text"
            },
            "sex": {
              "type": "text"
            },
            "child": {
              "type": "nested",
              "properties": {
                "name": {
                  "type": "text"
                },
                "height": {
                  "type": "float"
                },
                "width": {
                  "type": "float"
                }
              }
            }
          }
        }
      }
    }
  }
}

Я использую следующий запрос для поиска совпадений в свойстве parent.name и могуполучить блики.

{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "inner_hits": {
              "highlight": {
                "fields": {
                  "parent.name": {}
                },
                "number_of_fragments": 0,
                "pre_tags": [
                  "<span>"
                ],
                "post_tags": [
                  "</span>"
                ]
              }
            },
            "path": "parent",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "parent.name": {
                        "query": "John",
                        "fuzziness": "AUTO:3,6",
                        "prefix_length": "0"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ],
    }
  },
  "_source": ["parent"],
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "createdOn": {
        "order": "desc"
      }
    }
  ]
}

Есть ли способ получить встроенные блики для совпадений в свойствах child.name, чтобы было легко найти, какой именно элемент соответствующего массива сопоставлен?

Например, для данных данного примера, если я буду искать по «Доу», я ожидаю получить 6 совпадений, тогда как, если я буду искать по «Джейн», я получу только 4.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете просто добавить еще одно предложение nested query внутри вашего верхнего уровня should.

Вот как должен выглядеть ваш запрос:

{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "inner_hits": {
              "highlight": {
                "fields": {
                  "parent.name": {}
                },
                "number_of_fragments": 0,
                "pre_tags": [
                  "<span>"
                ],
                "post_tags": [
                  "</span>"
                ]
              }
            },
            "path": "parent",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "parent.name": {
                        "query": "John Doe 1"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "inner_hits": {
              "highlight": {
                "fields": {
                  "parent.child.name": {}
                },
                "number_of_fragments": 0,
                "pre_tags": [
                  "<span>"
                ],
                "post_tags": [
                  "</span>"
                ]
              }
            },
            "path": "parent.child",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "parent.child.name": {
                        "query": "Jane Doe 1"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "_source": ["parent"],
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "createdOn": {
        "order": "desc"
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...