Добавление фильтра, кажется, дает больше результатов - PullRequest
0 голосов
/ 01 июня 2019

Странная ситуация, связанная с добавлением фильтров к существующему запросу bool.

Этот запрос выводит ровно один результат, один из индекса "pages".Индекс «документы», как и ожидалось, с нашей стороны, имеет нулевые результаты для этого запроса.

Это имеет смысл.Эта версия запроса работает просто отлично.

{
  "index": "pages"
}
{
  "size": 30,
  "query": {
    "dis_max": {
      "queries": {
        "bool": {
          "should": [
            {
              "term": {
                "title_exact": "\"this is a test search phrase\""
              }
            },
            {
              "query_string": {
                "fields": [
                  "title"
                ],
                "query": "\"this is a test search phrase\""
              }
            },
            {
              "nested": {
                "path": "versions",
                "query": {
                  "query_string": {
                    "fields": [
                      "versions.page_content"
                    ],
                    "query": "\"this is a test search phrase\""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
{
  "index": "documents"
}
{
  "size": 30,
  "query": {
    "dis_max": {
      "queries": {
        "bool": {
          "should": [
            {
              "term": {
                "title_exact": "\"this is a test search phrase\""
              }
            },
            {
              "query_string": {
                "fields": [
                  "title"
                ],
                "query": "\"this is a test search phrase\""
              }
            },
            {
              "nested": {
                "path": "product.versions",
                "query": {
                  "query_string": {
                    "fields": [
                      "versions.page_content"
                    ],
                    "query": "\"this is a test search phrase\""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

Однако пользователи имеют возможность добавить фильтр к существующему запросу, в данном случае это продукт.

Это запрос, который отправляется.

{
  "index": "pages"
}
{
  "size": 30,
  "query": {
    "dis_max": {
      "queries": {
        "bool": {
          "should": [
            {
              "term": {
                "title_exact": "\"this is a test search phrase\""
              }
            },
            {
              "query_string": {
                "fields": [
                  "title"
                ],
                "query": "\"this is a test search phrase\""
              }
            },
            {
              "nested": {
                "path": "versions",
                "query": {
                  "query_string": {
                    "fields": [
                      "versions.page_content"
                    ],
                    "query": "\"this is a test search phrase\""
                  }
                }
              }
            }
          ],
          "filter": [
            {
              "term": {
                "product_id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
              }
            }
          ]
        }
      }
    }
  }
}
{
  "index": "documents"
}
{
  "size": 30,
  "query": {
    "dis_max": {
      "queries": {
        "bool": {
          "should": [
            {
              "term": {
                "title_exact": "\"this is a test search phrase\""
              }
            },
            {
              "query_string": {
                "fields": [
                  "title"
                ],
                "query": "\"this is a test search phrase\""
              }
            },
            {
              "nested": {
                "path": "product.versions",
                "query": {
                  "query_string": {
                    "fields": [
                      "versions.page_content"
                    ],
                    "query": "\"this is a test search phrase\""
                  }
                }
              }
            }
          ],
          "filter": [
            {
              "term": {
                "product.id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
              }
            }
          ]
        }
      }
    }
  }
}

Проблема здесь в том, что, хотя индекс «pages» по-прежнему выдает один желаемый результат, индекс «documents» теперь неожиданно сопоставляется с каждой записью, в которой есть этот идентификатор продукта, и увеличиваетсярезультаты, достижения.

и «фильтр», и «должен» делать одно и то же в этом сценарии.

Честно говоря, он должен давать тот же результат, что и предыдущий запрос.Фильтры должны только уменьшать наборы результатов, а не увеличивать их.

У кого-нибудь есть идеи?

Спасибо

1 Ответ

1 голос
/ 03 июня 2019

Решение

Добавьте минимум-должен-соответствовать к вашему запросу bool, чтобы запрос возвращал документы только при совпадении по крайней мере X количества предложений should,Кажется, значение по умолчанию 0, поэтому результаты основаны на запросе filter, а should просто присваивает scoring.

Запрос после добавления minimum-should-match:

{
  "index": "documents"
}
{
  "size": 30,
  "query": {
    "dis_max": {
      "queries": {
        "bool": {
          "should": [
            {
              "term": {
                "title_exact": "\"this is a test search phrase\""
              }
            },
            {
              "query_string": {
                "fields": [
                  "title"
                ],
                "query": "\"this is a test search phrase\""
              }
            },
            {
              "nested": {
                "path": "product.versions",
                "query": {
                  "query_string": {
                    "fields": [
                      "versions.page_content"
                    ],
                    "query": "\"this is a test search phrase\""
                  }
                }
              }
            }
          ],
          "filter": [
            {
              "term": {
                "product.id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
  }
}

Проблема

Краткое объяснение здесь:

  • filter - Просто фильтруйте документы, не имеющие отношения к scoring
  • should- Добавьте scoring, если соответствует.Однако минимум-должен-соответствовать изменит способ возврата документов.
  • must - Отфильтруйте документы и добавьте scoring

Bool query doc

Во втором запросе document общее количество совпадений основано на предложении filter, а предложение should назначит scoring только сопоставленным документам, но нене уменьшать результаты из-за минимальное совпадение (вероятно, по умолчанию) 0

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