1

特定の文字列のデータベース列で最も一致する文字列を見つけたいです。検索した後、次のテーブルとクエリを思いつきました

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 に設定しました。「Parsi」や「Parse」などの検索文字列で機能します。必要な結果が得られます。しかし、検索文字列が「par」や「pa」のように小さすぎると、結果が表示されません。

非常に短い文字列を使用して検索する場合でも、最も近い一致を取得するにはどうすればよいですか?

4

1 に答える 1

1

あなたは基本的にファジー演算子の限界に達しています

語幹展開とは異なり、ファジー展開によって生成される単語の数は、インデックスの内容によって異なります。結果は、インデックスの内容によって大きく異なる場合があります。

デフォルトを変更しない限り、Oracleは短い文字列にインデックスを付けません。

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;

この場合、クエリの書き換え/緩和を使用して、ファジー クエリとワイルドカード クエリを実際に組み合わせる必要がある場合があります。私の経験では、ワイルドカード展開はすべてを大幅に遅くする傾向がありますが、それは単に正しいインデックス構成の問題かもしれません.

于 2013-12-08T22:33:09.370 に答える