2013-12-08 2 views
1

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

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200)); 
INSERT INTO docs VALUES(1, 'California is a state in the US.'); 
INSERT INTO docs VALUES(2, 'Paris is a city in France.'); 
INSERT INTO docs VALUES(3, 'France is in Europe.'); 
INSERT INTO docs VALUES(4, 'Paris'); 

CREATE INDEX idx_docs ON docs(text) 
    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 
    ('DATASTORE CTXSYS.DEFAULT_DATASTORE'); 

SELECT SCORE(1), id, text 
    FROM docs 
WHERE CONTAINS(text, 'fuzzy(Parsi,1,1)', 1) > 0; 

Я поставил оценку подобия к минимуму, т.е. 1. Он работает для поиска строк, как «парси» или «Разобрать». Это дает мне желаемые результаты. Но если строка поиска слишком мала, как «par» или «pa», она не показывает мне никаких результатов.

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

ответ

1

Вы в основном поражая limit in the fuzzy operator

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

и оракул не index shorter strings, если вы не измените значение по умолчанию:

begin 
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH', '3'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', '4'); 
ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES'); 
end; 

В этом случае вы, возможно, на самом деле должны объединить нечеткие и подстановочные запросов с использованием query rewrite/relaxation. По моему опыту, расширение подстановочных знаков имеет тенденцию значительно замедлять все, хотя, возможно, это всего лишь вопрос правильной конфигурации индекса.

+0

Данные внутри таблицы не являются короткими строками. Его строка поиска короткая – AbrahamDaniel

+0

@BruceWayne имеет значение, что есть в индексе. В вашем случае он не содержит более короткие префиксы. – Tomasz

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

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