crate.io ПОЛНОТЕКСТОВЫЙ ПОИСК нечеткость

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

Вот документация, которой я следовал: https://crate.io/docs/reference/sql/fulltext.html

Пример таблицы:

CREATE TABLE IF NOT EXISTS "test"."accounts" (
   "customer_name" STRING INDEX USING FULLTEXT WITH (
      analyzer = 'standard'
   ),
"customer_no" STRING,
   PRIMARY KEY ("customer_no")
)


INSERT INTO "test"."accounts" 
(customer_name, customer_no)
VALUES('Walmart','C00001');

Моя цель будет заключаться в том, чтобы найти Walmart и вернуть Walmart.


person Wk Ali    schedule 22.01.2017    source источник


Ответы (1)


Стандартный анализатор, который вы используете для этого примера, разделит искомое слово «wal-mart» (из-за дефиса) на две лексемы — «wal» и «mart». Поскольку это, вероятно, не то, что вам нужно для описанного варианта использования, я бы рекомендовал добавить собственный анализатор, такой как:

create ANALYZER lowercase_keyword (
    TOKENIZER keyword,
    TOKEN_FILTERS (
        lowercase
    )
);

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

Затем создайте таблицу с вновь созданным анализатором и добавьте некоторые данные:

CREATE TABLE IF NOT EXISTS "test"."accounts" (
   "customer_name" STRING INDEX USING FULLTEXT WITH (
      analyzer = 'lowercase_keyword'
   ),
"customer_no" STRING,
   PRIMARY KEY ("customer_no")
);

INSERT INTO "test"."accounts" (customer_name, customer_no) VALUES ('Walmart', 'C00001'), ('Wal-mart', 'C00002'), ('wal-mart', 'C00003'), ('wal- mart’, ’C00004');

Теперь приведенный ниже запрос возвращает «Walmart», «Wal-mart» и «wal-mart»:

select customer_name from test.accounts where match(customer_name, 'walmart') using best_fields with (fuzziness=1);

При нечеткости 2 запрос дополнительно вернет «walmart».

person christian    schedule 27.03.2017