我正在使用Whoosh索引和搜索大量文档,我需要搜索的许多内容都是连字符。飞快移动似乎将连字符视为某种特殊的角色,但对于我的生活,我无法弄清楚它的行为。
任何人都可以建议在索引和搜索时Whoosh如何处理连字符?
答案 0 :(得分:1)
Whoosh只是将所有标点符号视为一个空格。假设使用默认的AND
搜索,则查询dual-scale thermometer
等效于dual AND scale AND thermometer
。这样会找到包含dual-scale digital thermometer
的文档,但也会找到dual purpose bathroom scale with thermometer
。
一种避免这种情况的解决方案是将查询中带连字符的单词转换为短语:"dual-scale" thermometer
,与"dual scale" AND thermometer
等效。
您还可以强制Whoosh接受连字符作为单词的一部分。为此,您可以使用接受连字符作为令牌有效部分的正则表达式覆盖RegexTokenizer
中的StandardAnalyzer
表达式。
from whoosh import fields, analysis
myanalyzer = analysis.StandardAnalyzer(expression=r'[\w-]+(\.?\w+)*')
schema = fields.Schema(myfield=fields.TEXT(analyzer=myanalyzer))
现在搜索dual-scale thermometer
等效于dual-scale AND thermometer
,将找到dual-scale digital thermometer
,但找不到"dual purpose bathroom scale with thermometer"
。
但是,您将无法独立搜索带连字符的单词。如果您的文档包含high-quality components
,则搜索quality
时将不匹配;仅high-quality
,因为这已成为一个令牌。由于存在这种副作用,除非您的内容在使用连字符严格限制为真正的原子连字单词之前使用,否则我建议使用短语方法。