Как на самом деле означает предложение "must" с массивом предложений "match"? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть elasticsearch query, который выглядит так ...

  "query": {
    "bool": {
      "must": [{
        "match": {"attrs.name": "username"}
      }, {
        "match": {"attrs.value": "johndoe"}
      }]
    }
  }

... и документы в индексе выглядят так:

{
  "key": "value",
  "attrs": [{
    "name": "username",
    "value": "jimihendrix"
  }, {
    "name": "age",
    "value": 23
  }, {
    "name": "alias",
    "value": "johndoe"
  }]
}

Какой из следующее: действительно означает?

  1. Документ должен содержать либо attrs.name = username ИЛИ attrs.value = johndoe
  2. Или документ должен содержать оба, attrs.name = username И attrs.value = johndoe, даже если они могут соответствовать различным элементам в массиве attrs (это будет означать, что приведенный выше документ будет соответствовать запросу)
  3. Или документ должен содержать оба, attrs.name = username И attrs.value = johndoe, но они должны соответствовать тому же элементу в массиве attrs (что будет означать, что документ, приведенный выше, не сопоставить запрос)

Далее, как мне написать запрос на express # 3 из списка выше, т.е. документ должен соответствовать, только если одиночный элемент внутри массива attrs соответствует обоим следующим условиям:

  • attrs.name = use rname
  • attrs.value = johndoe

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Должен означает «И» , чтобы был возвращен документ, удовлетворяющий всем условиям в запросе сопоставления.

Должен не соответствовать пункту 1. Документ должен содержать либо attrs.name = username ИЛИ attrs.value = johndoe - вам нужно предложение should, которое работает как «OR»

Будет ли Must удовлетворять пункту 2 или пункту 3, зависит от типа поля attrs.

Если тип поля «attr» - объект , то поля выравниваются, что не поддерживает связь между различными полями для массива. Поэтому запрос должен вернуть документ, если какие-либо attrs.name = "username" и attrs.value = "John doe", даже если они не являются частью одного и того же объекта в этом массиве.

Если вам нужен объект в массиве, чтобы действовать как отдельный документ, вам нужно использовать поле вложенный и использовать вложенный запрос для сопоставления документов

{
  "query": {
    "nested": {
      "path": "attrs",
      "inner_hits": {}, --> returns matched nested documents
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "attrs.name": "username"
              }
            },
            {
              "match": {
                "attrs.value": "johndoe"
              }
            }
          ]
        }
      }
    }
  }
}

совпадения в ответе будут содержать все вложенные документы, чтобы получить все совпавшие вложенные документы, необходимо указать inner_hits

0 голосов
/ 28 мая 2020

Исходя из ваших требований, вам необходимо определить свое поле attrs как вложенное. Для получения дополнительной информации обратитесь к вложенному типу в Elasticsearch . Заявление об отказе от ответственности: он поддерживает взаимосвязь, но требует больших затрат на запрос.

Ответ на два других вопроса также зависит от того, какой тип данных вы используете, пожалуйста, обратитесь к тип данных вложенный или объектный для получения дополнительных сведений

Изменить: решение с использованием образца сопоставления, примеров документов и ожидаемого результата

Сопоставление индекса с использованием вложенного типа

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

Индекс 2 образец do c один, который разделяет критерии, а другой - нет

{
    "attrs": [
        {
            "name": "username",
            "value": "johndoe"
        },
        {
            "name": "alias",
            "value": "myname"
        }
    ]
}

Другой, который обслуживает критерии

{
    "attrs": [
        {
            "name": "username",
            "value": "jimihendrix"
        },
        {
            "name": "age",
            "value": 23
        },
        {
            "name": "alias",
            "value": "johndoe"
        }
    ]
}

И поисковый запрос

{
  "query": {
    "nested": {
      "path": "attrs",
      "inner_hits": {}, 
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "attrs.name": "username"
              }
            },
            {
              "match": {
                "attrs.value": "johndoe"
              }
            }
          ]
        }
      }
    }
  }
}

И результат поиска

 "hits": [
            {
                "_index": "nested",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.7509375,
                "_source": {
                    "attrs": [
                        {
                            "name": "username",
                            "value": "johndoe"
                        },
                        {
                            "name": "alias",
                            "value": "myname"
                        }
                    ]
                },
                "inner_hits": {
                    "attrs": {
                        "hits": {
                            "total": {
                                "value": 1,
                                "relation": "eq"
                            },
                            "max_score": 1.7509375,
                            "hits": [
                                {
                                    "_index": "nested",
                                    "_type": "_doc",
                                    "_id": "2",
                                    "_nested": {
                                        "field": "attrs",
                                        "offset": 0
                                    },
                                    "_score": 1.7509375,
                                    "_source": {
                                        "name": "username",
                                        "value": "johndoe"
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...