乱序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 全文搜索中文乱序问题的解决。通过对字符串的统一处理,我们能够避免传统的全文搜索对中文乱序的严重影响,从而提高搜索的准确性和效率。


数据运维技术 » 乱序Oracle全文搜索解决中文乱序问题(oracle全文搜索中文)