乱序Oracle全文搜索解决中文乱序问题(oracle全文搜索中文)
乱序Oracle全文搜索解决中文乱序问题
传统的 Oracle 全文搜索在处理中文乱序问题上表现较为捉急,使得搜索结果不尽人意。不过,解决这个问题的办法倒也不难,只需要对搜索字符串和文档内容进行转换和归一化。
我们需要对中文字符串进行排序,使用“拼音首字母+拼音”的方式归一化字符串,这里我们借助第三方库 pykakasi (Python3)来实现。具体代码如下所示:
import pykakasi
import re
# 将中文字符串转化为拼音首字母+拼音的形式def cn2py(string: str):
kks = pykakasi.kakasi() result = []
for k in string: # 将每个汉字转化为拼音 py = kks.convert(k)[0]['hepburn']
if re.search('[a-zA-Z]', py): result.append(py)
return ''.join(result)
# 对搜索字符串进行排序归一化keyword = '全文搜索'
sorted_keyword = ''.join(sorted(cn2py(keyword)))
对于文档内容部分,我们可以先把文档中的中文字符串转换为同样的格式,再将文档中的字符串切分为一个个词语。具体代码如下:
import jieba
# 将文档中的中文字符串转化为拼音首字母+拼音的形式def cn2py(string: str):
kks = pykakasi.kakasi() result = []
for k in string: # 将每个汉字转化为拼音 py = kks.convert(k)[0]['hepburn']
if re.search('[a-zA-Z]', py): result.append(py)
return ''.join(result)
# 对文档进行处理,转换中文字符串,再进行分词text = 'Oracle 全文搜索是很多应用的基础,Oracle 中文全文搜索则更具有抢眼的性能。'
py_text = cn2py(text) # 中文转化为拼音首字母+拼音# 使用 jieba 分词对文档进行切分
segs = jieba.cut(py_text, cut_all=False)
# 将分词后的词语拼接成一个字符串document = ''.join(segs)
使用以上的方法能够得到一组归一化后的字符串,我们将它们作为索引,根据归一化后的字符串来进行搜索和匹配。具体代码如下:
# 构建全文索引
index = {}doc_id = 0
for s in texts: py_s = cn2py(s)
segs = jieba.cut(py_s, cut_all=False) text = ''.join(segs)
for keyword in set(re.findall(r'[a-zA-Z]+', text)): sorted_keyword = ''.join(sorted(keyword))
if sorted_keyword not in index: index[sorted_keyword] = {}
if doc_id not in index[sorted_keyword]: index[sorted_keyword][doc_id] = []
for pos in re.finditer(keyword, text): index[sorted_keyword][doc_id].append(pos.start())
doc_id += 1
# 搜索results = set(range(doc_id))
for keyword in set(re.findall(r'[a-zA-Z]+', cn2py('全文搜索'))): sorted_keyword = ''.join(sorted(keyword))
if sorted_keyword not in index: results = set()
break results &= set(index[sorted_keyword].keys())
以上代码即可实现乱序 Oracle 全文搜索中文乱序问题的解决。通过对字符串的统一处理,我们能够避免传统的全文搜索对中文乱序的严重影响,从而提高搜索的准确性和效率。