在狮身人面像中以CRC模式在单词之间进行通配符搜索

时间:2018-07-25 10:30:26

标签: sphinx sphinxql wildcard-expansion

我将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模式。

  • 我还使用了'^'和'$'运算符,但没有用。

1 个答案:

答案 0 :(得分:0)

您不能在CRC中使用“中间”通配符。 dict = keywords的原因之一,它可以支持的通配符很多更加灵活。

使用CRC,它“预先计算”所有通配符组合,并将它们作为索引中的单独关键字插入,例如

例如将mickel作为文档单词,并使用min_prefix_len=1indexer将创建单词:

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需要坚持两者都匹配。 (尽管无法考虑如何使它们与同一词匹配!)