Совпадение слова без пробела для сопоставления с текстом пробела вasticsearch - PullRequest
1 голос
/ 02 марта 2020

Название вопроса немного вводит в заблуждение, но я не знаю, как правильно его сформулировать, но вот мой сценарий

У меня есть слово Водные салфетки (см. Пространство между ) в названии записи о товаре в моем elasti c поиске. Теперь мне нужно сопоставить его с водяными салфетками . поскольку между ними нет пробела, я получаю нулевые результаты для запроса waterwipes . Ниже приведен запрос на совпадение в поиске Elasti c (здесь я использую PHP)

 $mustConditions = [
   [
      "nested" => [
          "path"  => "name",
          "query" => [
             "multi_match" => [
                "query"            => (string)$query,
                "fields"           => ['name.en^3', 'name.ar^3'],
                "zero_terms_query" => "all",
                "fuzziness"        => "auto",
                "operator"         => "AND",
             ],
          ],   
        ],
      ],
   ];

И анализатор для поля - 'engli sh'. Как мне подобрать слова типа Water Wipes для Waterwipes

1 Ответ

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

Вам нужно удалить пробел из названия вашего продукта и проиндексировать его, а затем вы можете запросить это слово.

Пожалуйста, смотрите параметр Индекс для удаления пробела: {

    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "replace_whitespace"
                    ]
                }
            },
            "char_filter": {
                "replace_whitespace": {
                    "type": "mapping",
                    "mappings": [
                        "\\u0020=>"
                    ]
                }
            }
        }
    }
}

После этого вы можете использовать ES анализ API для подтверждения его генерирующего токена, который будет соответствовать вашим токенам поискового запроса.

POST _analyze

{
    "text": "Water wipes",
    "analyzer" : "my_analyzer"
}

{
    "tokens": [
        {
            "token": "Waterwipes", --> Notice whitespace is removed
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

Предложения : Вы должны сохранить эти токены, удаленные из пробелов, в другом поле title, например titlewospaces, и применить к нему выше собственный анализатор и выполнить поиск в обоих полях, чтобы получить лучшие результаты. Кроме того, вы должны проверить Объяснить API , чтобы увидеть, какие токены генерирует ваш запрос и как он соответствует индексированным токенам.

...