Bool должен запросить с фильтром и вложенным объектом - PullRequest
1 голос
/ 13 марта 2020

У меня есть sourceString документы с вложенным объектом targetStrings targetStrings правильно отображается как вложенный тип:

PUT /test-string
{
  "mappings": {
    "properties": {
      "id": { "type": "keyword" },
      "pid": { "type": "keyword" },
      "text": {
        "type": "text"
      },
      "targetStrings": {
        "type": "nested",
        "properties": {
          "pid": { "type": "keyword" },
          "text": {
            "type": "text"
          }
        }
      }
    }
  }
}

Образцы документов:

POST test-string/_doc
{
  "id": "1",
  "pid": "someId",
  "text": "lorem",
  "targetStrings": [
    {
      "pid": "someId",
      "text": "ipsum"
    }
  ]
}
POST test-string/_doc
{
  "id": "2",
  "pid": "someId",
  "text": "dolor",
  "targetStrings": [
    {
      "pid": "someId",
      "text": "sit"
    }
  ]
}

Если я удаляю фильтр, поиск работает. Но с фильтром я получаю 2 результата, что говорит о том, что он просто применяет фильтр, а не AND с его частью should. Это с Elasticseach версии 7.6.

GET test-string/_search
{
  "query": {
    "bool": {
"filter":[
        {"term":{"pid":"someId"}}
      ],
      "should": [
        {
          "match": {
            "text": "lorem"
          }
        },
        {
          "nested": {
            "path": "targetStrings",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "targetStrings.text": "foobar"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

1 Ответ

1 голос
/ 13 марта 2020

Должно быть что-то не так с вашим отображением, которым вы не поделились с нами.

Вот мои шаги репликации:

Индекс инициализации с вложенным отображением:

PUT /source-string
{
  "mappings": {
    "dynamic": true,
    "properties": {
      "targetStrings": {
        "type": "nested",
        "properties": {
          "text": {
            "type": "text"
          }
        }
      },
      "text": {
        "type": "text"
      }
    }
  }
}

Индексировать образец объекта:

POST source-string/_doc
{
  "text": "foo",
  "targetStrings": [
    {
      "text": "bar"
    },
    {
      "text": "lorem ipsum"
    },
    {
       "text": "NOTAMATCH"
    }
  ]
}

Запросить ваш text и вложенный targetStrings.text:

GET source-string/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "text": "NOTAMATCH"
          }
        },
        {
          "nested": {
            "path": "targetStrings",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "targetStrings.text": "NOTAMATCH"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

, который дает ровно 1 попадание.


К вашему сведению в конце раздела filter в вашем запросе было слишком много запятых:

      "filter":[
        {"term":{"pid":"dh9lc4ZLdmZgtYNY0Q9O"}},
        {"term":{"sourceType":"glossary"}},        <--------  
      ],

Изменить после редактирования вопроса

Переместить bool-should внутри фильтра, чтобы заставить ваше предложение «ИЛИ» внутри «И»:

GET test-string/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "pid": "someId"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "text": "lorem"
                }
              },
              {
                "nested": {
                  "path": "targetStrings",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "targetStrings.text": "foobar"
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...