Как запросить альтернативные варианты написания и представления слов вasticsearch? - PullRequest
1 голос
/ 31 марта 2020

Я использую эластичный поиск для запроса в поле theme в документах. Например:

[
  { theme: 'landcover' },
  { theme: 'land cover' },
  { theme: 'land-cover' },
  etc
]

Я хотел бы указать поиск термина landcover, который соответствует всем этим документам. Как мне это сделать?

До сих пор я пытался использовать оператор нечеткости в поиске match, а также нечеткий запрос. Однако ни один из этих подходов, кажется, не работает, что удивило меня, потому что мое понимание нечетких поисков заключается в том, что они обеспечивают средство неточного сопоставления.

Чего мне не хватает? Из документов я вижу, что нечеткость определенно ищет близкие приближения к поисковому запросу:

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

Я бы посчитал, что 'landcover' и 'land cover' близки. Разве это не так? (это первый раз, когда я услышал о Левенштейне редактировать расстояние, поэтому я не знаю, что означают дополнительные / меньшие символы в терминах этого измерения).

Пример запроса на совпадение, который, кажется, не работает:

{
  query: {
    match: {
      'theme': {
        query: 'landcover'
        fuzziness: 'AUTO' // I've tried 2, '2', 6, '6', etc.
      },
    },
  },
}

// When the term is 'land-cover' and fuzziness is auto, then 'land cover' is matched. But 'landcover' is not

И пример нечеткого запроса, который, похоже, не работает:

{
  query: {
    fuzzy: {
      'theme': {
        value: query,
        fuzziness: 'AUTO', // Tried other values
      },
    },
  },
}

// When the term is 'land-cover' and fuzziness is auto, then 'landcover' is matched. But 'land cover' is not. So works almost opposite to the match query in this regard

(ПРИМЕЧАНИЕ. Эти запросы преобразуются в JSON и выполняются и возвращают ощутимые результаты, просто нечеткость не работает так, как я ожидал)

Осматривая StackOverflow, Я вижу некоторые вопросы, которые, по-видимому, указывают на то, что запрос индекса каким-то образом связан с тем, как создается индекс - то есть я не могу просто выполнить adho c запросов для любого индекса, который уже существует, и ожидать результатов. Это правильно? (извините - я новичок вasticsearch и запрашиваю индекс, который уже существует).

Этот ответ кажется связанным (как найти близкие совпадения для поискового запроса): { ссылка } - упоминается, что я должен сделать что-то, что называется «отображением поля» перед индексацией данных. но тогда пример запроса не включает в себя оператор fuzziness. Так что в этом случае я запутался в том, для чего вообще нужен смысл оператора нечеткости.

1 Ответ

0 голосов
/ 31 марта 2020

Более подробно изучив документацию, я обнаружил следующее:

Elasticsearch использует концепцию «индекса», а не базы данных. Но с точки зрения того, кто знаком с CouchDB и MongoDB, которые являются JSON хранилищами, определенно есть некоторое сходство между базой данных CouchDB и индексом Elasticsearch. Хотя индексasticsearch сам по себе не является авторитетным хранилищем данных (он «построен» из источника данных).

Для заданного индекса, например, my-index. Вы можете вставить JSON строк (документов) в my-index с помощью PUT, связавшись с Elasticsearch:

PUT /... '{... json string ...}'

Строка JSON может быть получена непосредственно из магазина JSON (пн go) , Couch, et c.) Или быть вымощенными из различных источников. Я думаю.

Elasticsearch обработает документ при вставке и добавит к инвертированному дереву. Для текстовых полей это означает, что пары K: V будут созданы из JSON текста документа, где ключи являются фрагментами текста, а значения - это ссылки на то, где этот фрагмент текста находится в источнике (документ JSON) .

Другими словами, при вставке документов в индекс Elasticsearch содержимое «анализируется» для создания пар K: V, которые добавляются в индекс.

Я полагаю, что поиск Elasticsearch означает поиск поисковых терминов, которые являются ключами в индексе, и сравнение значений (источника ключа) с источником, определенным в поиске (я думаю), и возврат исходного документа, в котором присутствует поисковый термин для конкретное поле.

Итак:

  1. Текст анализируется при вставке в индекс
  2. Анализируются запросы (с использованием того же анализатора, который использовался для создания индекса)

Так что в моем случае (как упомянуто выше) анализатор по умолчанию достаточно хорош для создания индексов, которые допускают базовое c нечеткое совпадение ing (то есть в запросе на совпадение «land-cover» сопоставляется с «land cover», а в нечетком запросе «land-cover» сопоставляется с «landcover» - я понятия не имею, почему они совпадают по-разному!)

Но чтобы улучшить результаты поиска, я думаю, что мне нужно настроить анализатор / токенизатор как при вставке документов в индекс, так и при анализе запросов для применения к индексу.

Мое понимание анализа / токенизации заключается в том, что это конфигурация, с помощью которой инвертированные индексы строятся из исходных документов. т.е. определение того, какими будут ключи инвертированного индекса. Насколько я могу судить, в поиске по индексу нет волхвов c. поисковые термины должны совпадать с ключами в инвертированном индексе, иначе результатов не будет.

Я до сих пор не уверен, что на самом деле делает нечеткость в этом контексте.

Короче говоря, запрашивая эластичный поиск Похоже, что требуется «holisti c ракурс» как в отношении того, как исходные данные индексируются, так и в отношении того, как создаются запросы.

Тем не менее, как заявление об отказе от ответственности, я не совсем авторитетный ответ на этот вопрос с менее чем одним днем ​​опыта эластичного поиска, поэтому лучший ответ все равно будет оценен!

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