Elasti c Поиск проблемы с simple_query_string - PullRequest
0 голосов
/ 22 апреля 2020

Я не смог найти идеального решения для следующей ситуации, надеюсь, здесь кто-нибудь сможет помочь.

Предположим, имеются следующие документы для типа, называемого "группы":

  1. { "name": "Orders 1.0"}
  2. {"name": "Reports & Analysis 1.0"}
  3. {"name": "Rebates 1.0"}

Когда я выполняю поиск документов, используя ниже simple_query_string, я получаю все три записи вместо только одной записи (т. Е. # 1)

{
"size" : 20,
  "query" : {
    "bool" : {
      "must" : [
        {
          "bool" : {
            "should" : [
              {
                "simple_query_string" : {
                  "query" : "Orders 1.0*",
                  "fields" : [
                    "name^1.0"
                  ],
                  "flags" : -1,
                  "default_operator" : "or",
                  "lenient" : false,
                  "analyze_wildcard" : true,
                  "boost" : 1.0
                }
              }
            ],
            "disable_coord" : false,
            "adjust_pure_negative" : true,
            "boost" : 1.0
          }
        }
      ],
      "disable_coord" : false,
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  }
}

Я хочу, чтобы только одна запись была найдена с именем как Заказы 1.0

1 Ответ

0 голосов
/ 23 апреля 2020

Причина в этом "default_operator" : "or",. Я предполагаю, что поле name является анализируемым полем. Если он использует анализатор, то он будет размечен. То же самое касается вашего ввода. Таким образом, у вас есть следующее (для стандартного анализатора)

  • Orders 1.0 -> ["orders", "1.0"]
  • Reports & Analysis 1.0 -> ["reports", "analysis", "1.0"]
  • Rebates 1.0 -> ["rebates", "1.0"]
GET _analyze
{
  "analyzer": "standard",
  "text": ["Orders 1.0", "Reports & Analysis 1.0", "Rebates 1.0"]
}

{
  "tokens" : [
    {
      "token" : "orders",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "1.0",
      "start_offset" : 7,
      "end_offset" : 10,
      "type" : "<NUM>",
      "position" : 1
    },
    {
      "token" : "reports",
      "start_offset" : 11,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "analysis",
      "start_offset" : 21,
      "end_offset" : 29,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "1.0",
      "start_offset" : 30,
      "end_offset" : 33,
      "type" : "<NUM>",
      "position" : 4
    },
    {
      "token" : "rebates",
      "start_offset" : 34,
      "end_offset" : 41,
      "type" : "<ALPHANUM>",
      "position" : 5
    },
    {
      "token" : "1.0",
      "start_offset" : 42,
      "end_offset" : 45,
      "type" : "<NUM>",
      "position" : 6
    }
  ]
}

Поскольку оператор по умолчанию - OR, это означает, что что вам нужен какой-либо из анализируемых токенов, а не все. И поскольку вы включили 1.0, который присутствует на всех них, он соответствует всем документам. Одним из решений является изменение оператора по умолчанию на AND

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