Elastic Search регистронезависимый запрос с префиксным запросом - PullRequest
0 голосов
/ 17 июня 2019

Я новичок в упругом поиске.У меня есть запрос ниже

GET deals2/_search 
{
  "size": 200,
  "_source": ["acquireInfo"],
   "query": {
    "bool": {

      "must": [
        {

         "query_string": {
           "fields": ["acquireInfo.company_name.keyword"],
           "query": "az*"
         }
        }
      ]
    }
  }

}

Здесь я хочу, чтобы Elastic выдавал результаты как без учета регистра Как строка начинается с ниже как

"Az" 
"AZ" 
"az"
"aZ"
"Az"

Но я не получаювсе результаты как этот.Так что любой может помочь мне в этом.

Пример: - У меня есть 4 документа

1)Aziia Avto Ust-Kamenogorsk OOO 
2)AZ Infotech Inc 
3)AZURE Midstream Partners LP 
4)State Oil Fund of the Republic of Azerbaijan

Теперь поиск по az должен вернуть только первые 3 документа, так как они начинаются с az игнорируя регистр здесь, а не 4-й, который также имеет az, но не в начале.

1 Ответ

2 голосов
/ 17 июня 2019

Это происходит, когда вы используете поле ключевого слова для индексации company_name в вашем приложении.

Анализатор ключевых слов - это анализатор «noop», который возвращает всю входную строку как однутокен , например, название компании, состоящее из foo, Foo, fOo будет храниться только с регистром, а поиск foo будет совпадать только с foo, поскольку эластичный поиск в конечном итоге работает на совпадении токенов(который чувствителен к регистру).

Вам нужно использовать стандартный анализатор или какой-либо другой пользовательский анализатор , который также решает ваши другие варианты использования и использует строчный фильтр токенов для поля и использование запроса match , который анализируется и использует тот же анализатор, который используется для индексации поля, таким образом, ваш поисковый запрос будет генерировать те же токены, который хранится в индексе, и ваш поиск станет без учета регистра.

Редактировать: Поговорил с пользователем в чате и обновил ответ на sui.t его требования, которые приведены ниже: -

Шаг 1: - Определить параметры и отображение для индекса.

Конечная точка: - http://{{hostname}}:{{port}}/{{index}}

{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": "lowercase"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "company_name": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

Шаг 2: Индексировать все документы

Конечная точка: http://{{hostname}}:{{port}}/{{index}}/_doc/ -> 1,2,3,4 и т. Д.

{
    "company_name" : "State Oil Fund of the Republic of Azerbaijan"
}

Шаг 3: - Поисковый запрос

Конечная точка: - http://{{hostname}}:{{port}}/{{index}}/_search

{ "query": {
    "prefix" : { "company_name" : "az" }
  }
}

Это приведет к ожидаемым ниже результатам: -

{
    "took": 870,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "2ec9df0fc-dc04-47bb-914f-91a9f20d09efd15f2506-293f-4fb2-bdc3-925684a930b5",
                "_score": 1,
                "_source": {
                    "company_name": "AZ Infotech Inc"
                }
            },
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "160d01183-a308-4408-8ac1-a85da950f285edefaca2-0b68-41c6-ba34-21bbef57f84f",
                "_score": 1,
                "_source": {
                    "company_name": "Aziia Avto Ust-Kamenogorsk OOO"
                }
            },
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "1da878175-7db5-4332-baa7-ac47bd39b646f81c1770-7ae1-4536-baed-0a4f6b20fa38",
                "_score": 1,
                "_source": {
                    "company_name": "AZURE Midstream Partners LP"
                }
            }
        ]
    }
}

Объяснение: , как ранее OP не было; tупомяните исключение 4-го документа в результатах поиска, поэтому я предложил создать текстовое поле, чтобы генерировать отдельные токены, но теперь, поскольку требование - это только поиск по префиксу, нам не нужны отдельные токены, и мы хотели бы только1 токен, но он должен быть в нижнем регистре для поддержки поиска без учета регистра, поэтому я применил пользовательский нормализатор к полю company_name.

...