我正在使用复杂的短语查询实现solr模糊搜索。
但我正在分阶段审理一个案件:
q={!complexphrase}name:"woo~1 grou~2"
返回" 木组"结果是。
q={!complexphrase}name:"woo~1 gro~2"
不返回" 木组"。
gro和group之间的距离是2!
搜索此查询:
q={!complexphrase}name:"Anderso~1 Interes~2"
返回' Anderson兴趣'。
Interes和Interests之间的延迟与gro和group相同!!!
任何想法是什么原因?
答案 0 :(得分:3)
我相信你遇到了查询重写的问题。
任何多项查询(模糊查询,前缀查询等)都会在Lucene中扩展为与其匹配的确切术语。尽管如此,可以通过这种方式生成的术语数量最多,因此在重写查询时,它只会尝试在该限制内选择最佳。我怀疑gro~2
的匹配太多了。
也许你会觉得很奇怪,有这么多的匹配,它不能将所有这些匹配到查询中。看起来你正试图搜索以gro开头的单词,最后还有两个字母。有多少可以?但那不是你正在寻找的东西。模糊查询基于levenshtein距离。该术语的匹配包括:
g__
- 以g _r_
- 中间带有r的三个字母的单词__o
- 三个字母的单词,最后带有o gr__
- 以gr 简而言之,它可以匹配大量术语列表,而在相似度算法方面,“arm”和“cron”匹配就像“group”一样。
如果确实只想匹配以“gro”开头的字词,请使用前缀查询:"woo* gro*"
。
如果您想使用模糊查询进行实际搜索,包括上面列出的可能匹配项,您可以在solrconfig's query section中放大MaxBooleanClauses
。
<query>
<maxBooleanClauses>1024</maxBooleanClauses>