我将Sphinx与CRC模式一起使用,并且min_infix_length = 1,并且我想在关键字的字符之间使用通配符搜索。假设我的索引文件中有一些这样的数据:
name
-------
mickel
mick
mickol
mickil
micknil
nickol
nickal
当我搜索所有记录时,它们的名称以'mick'开头并以'l'结尾:
select * from all where match ('mick*l')
我希望结果应该像这样:
name
-------
mickel
mickol
mickil
micknil
,但未返回任何内容。我怎样才能做到这一点?
我知道我可以在dict = keywords模式下执行此操作,但是出于某些原因,我应该使用crc模式。
我还使用了'^'和'$'运算符,但没有用。
答案 0 :(得分:0)
您不能在CRC中使用“中间”通配符。 dict = keywords的原因之一,它可以支持的通配符很多更加灵活。
使用CRC,它“预先计算”所有通配符组合,并将它们作为索引中的单独关键字插入,例如
例如将mickel
作为文档单词,并使用min_prefix_len=1
,indexer
将创建单词:
mickel
mickel*
micke*
mick*
mic*
mi*
m*
...作为索引中的单词,因此所有组合都可以匹配。如果使用min_infix_len
,它还必须在开始时也进行所有组合(所以(word_length)^2 + 1
组合)
...如果必须在中间预先计算通配符的所有组合,则可能会更多。尤其是如果之后也允许所有中间AND开始/结束组合)
尽管如此,您仍可以重写
select * from all where match ('mick*l')
为
select * from all where match ('mick* *l')
因为使用min_infix_len,所以开始和结束将被索引为单字。 Jus需要坚持两者都匹配。 (尽管无法考虑如何使它们与同一词匹配!)