0

我使用带有 CRC 模式和 min_infix_length = 1 的 sphinx,我想在关键字的字符之间使用通配符搜索。假设我的索引文件中有一些这样的数据:

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

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

4

1 回答 1

0

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

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

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

mickel
mickel*
micke*
mick*
mic*
mi*
m*

...作为索引中的单词,因此所有组合都可以匹配。如果使用min_infix_len,它还必须在开始时进行所有组合(所以(word_length)^2 + 1组合)

...如果它必须预先计算中间通配符的所有组合,那将是更多。特别是如果 then 也允许所有中间和开始/结束组合)


话虽如此,但您可以重写

select * from all where match ('mick*l')

作为

select * from all where match ('mick* *l')

因为使用 min_infix_len,开始和结束将被索引为单独的单词。只是需要坚持两者匹配。(虽然想不出如何让他们机器人匹配同一个词!)

于 2018-07-25T11:02:48.077 回答