【发布时间】:2014-11-28 19:45:26
【问题描述】:
我有一个存储人员的 Oracle 数据库 表。例如:
|-------------|---------|
| Name | Data |
|-------------|---------|
| Marton | XYZ |
| Márton | XYZ |
|-------------|---------|
我使用 Oracle 在 name 列上进行模糊搜索。问题是当我搜索 Márton 时,我得到 2 个条目(这很好),但是当我搜索 Marton 时,我只得到一个条目,这不是我所期望的。
这是我尝试做的一个完整示例:
CREATE TABLE persons (
NAME VARCHAR(256) NOT NULL,
DATA VARCHAR(256) NOT NULL
);
INSERT INTO persons VALUES('Marton', '42');
INSERT INTO persons VALUES('Márton', '42');
begin
--ctx_ddl.drop_preference('my_store');
ctx_ddl.create_preference('my_store', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('my_store', 'columns', 'NAME');
--ctx_ddl.drop_preference('my_lexer');
ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER');
ctx_ddl.set_attribute('my_lexer','index_stems','NONE');
--ctx_ddl.drop_preference('my_wordlist');
ctx_ddl.create_preference('my_wordlist', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('my_wordlist','fuzzy_match','GENERIC');
ctx_ddl.set_attribute('my_wordlist','stemmer','NULL');
end;
/
--DROP INDEX MY_FUZZY_IDX;
CREATE INDEX MY_FUZZY_IDX ON persons(NAME) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('datastore my_store section group ctxsys.auto_section_group lexer my_lexer wordlist my_wordlist stoplist ctxsys.empty_stoplist');
-- Returns only 1 entry! Not OK!
select * from persons where contains(NAME, '(fuzzy(Marton, 65, 100, W) within NAME)', 0) > 0;
-- Returns both entries! OK!
select * from persons where contains(NAME, '(fuzzy(Márton, 65, 100, W) within NAME)', 0) > 0;
是我建立的索引错误还是使用模糊搜索错误?
【问题讨论】: