Как искать в Elasticsearch слова с апострофом или без него?и иметь дело с орфографическими ошибками? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь переместить свою логику полнотекстового поиска с MySQL на Elasticsearch.В MySQL, чтобы найти все строки, содержащие слово «женщина», я бы просто написал

SELECT b.code
FROM BIBLE b 
WHERE ((b.DISPLAY_NAME LIKE '%woman%')
 OR (b.BRAND LIKE '%woman%')
 OR (b.DESCRIPTION LIKE '%woman%'));

на эластичном поиске. Я пытался найти что-то похожее

curl -X GET "localhost:9200/bible/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "multi_match": { "query": "WOMAN","fields": ["description","display_name","brand"] } }, "sort": { "code": {"order": "asc" } },"_source":["code"]
}
'

, но оно не имело такого же количествапри дальнейшей проверке я нашел слова типа woman's, которые не были найдены эластичным поиском, но были найдены MySQL.Как мне решить эту проблему?

И

Как объединить такие вещи, как поиск слов даже с орфографическими ошибками или фонетически одинаковые слова?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

В эластичном поиске необходимо выполнить сопоставление полей перед индексацией данных. Сопоставление - это способ информированияasticsearch для индексирования данных особым образом для извлечения данных желаемым способом.

Попробуйте следующий DSL-запрос (формат JSON) для создания собственного анализатора и сопоставления:

PUT {YOUR_INDEX_NAME}
{
 "settings": {
   "analysis": {
    "analyzer": {
     "my_analyzer": {
       "tokenizer": "my_tokenizer"
     }
   },
   "tokenizer": {
     "my_tokenizer": {
       "type": "ngram",
       "min_gram": 3,
       "max_gram": 20,
       "token_chars": [
         "letter",
         "digit"
       ]
     }
   }
 },
 "max_ngram_diff": 20 //For Elasticsearch v6 and above
},
"mappings": {
 "properties": {
   "code": {"type": "long"},
   "description": {
     "type": "text",
     "analyzer": "my_analyzer"
   },
   "display_name": {
     "type": "text",
     "analyzer": "my_analyzer"
   },
   "brand": {
     "type": "text",
     "analyzer": "my_analyzer"
   }
  }
 }
}

Пример запроса:

GET {YOUR_INDEX_NAME}/_search
{
  "query": {
    "multi_match" : {
      "query" : "women",
      "fields" : [ "description^3", "display_name", "brand" ] 
    }
  }
}

Я предлагаю вам взглянуть на нечеткий запрос на наличие орфографических ошибок.

Попробуйте использовать пользовательский интерфейс Kibana для тестирования индекса с помощью DSL-запроса, а не cURL, что сэкономит ваше время.

Надеюсь, это поможет вам.

0 голосов
/ 20 апреля 2019

Во-первых, как выглядит ваше отображение? Используете ли вы какой-либо токенизатор. Если нет, я бы посоветовал вам воспользоваться поиском wildcard , чтобы использовать токенизатор ngram . В основном используется для частичных совпадений.

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

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