2017-01-22 17 views
1

Я хотел бы использовать Levenshtein и Im для поиска некоторых примеров. Я уже прочитал документацию, но я не знаю, как ее реализовать. Я попытался создать свой собственный анализатор, но он разбился каждый раз, когда я его использовал.crate.io FULLTEXT SEARCH fuzziness

Вот документация I follwed: 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.

ответ

2

Стандартный анализатор, который вы используете для этого примера, разделил бы слово поиска «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', 'Walmart' и 'Wal-Mart':

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

С нечеткостью 2 запроса будет дополнительно возвращаться «wal-mart».

 Смежные вопросы

  • Нет связанных вопросов^_^