配置Sphinx以尽可能地处理空格

配置Sphinx以尽可能地处理空格,sphinx,Sphinx,假设我有一个文本foobarbaz-Qux。如何配置Sphinx的索引器,以便Sphinx能够找到任何给定字符串的匹配项 Foo Bar Baz-Qux Foo BazQux Bar Baz Qux Foo Bar 目前我有一个破折号作为ignore_chars设置的值,Sphinx为前两个查询提供了结果,但没有为第三个查询提供结果 请注意,解决方案必须是通用的,而不是依赖于示例中的特定词语或它们的相关顺序 谢谢 我找到了一个解决方案(或解决方法):使用 Sphinx索引配置现在看起来像这样:

假设我有一个文本
foobarbaz-Qux
。如何配置Sphinx的索引器,以便Sphinx能够找到任何给定字符串的匹配项

Foo Bar Baz-Qux
Foo BazQux Bar
Baz Qux Foo Bar
目前我有一个破折号作为
ignore_chars
设置的值,Sphinx为前两个查询提供了结果,但没有为第三个查询提供结果

请注意,解决方案必须是通用的,而不是依赖于示例中的特定词语或它们的相关顺序

谢谢

我找到了一个解决方案(或解决方法):使用

Sphinx索引配置现在看起来像这样:

...
ignore_chars = -
regexp_filter = \b([\w\d]+)-([\w\d]+)\b => \1\2 \1 \2
...
所以,就在斯芬克斯将文本放入索引之前,它会将所有包含破折号的单词分成两种形式:第一种形式是简单地删除破折号,第二种形式是用空格替换破折号。在创建索引时,文本“FooBar”的三个单词将被索引:“FooBar”、“Foo”和“Bar”。这让我可以使用以下任何查询进行搜索:“FooBar”(破折号将被删除,因为它位于
ignore_chars
列表中)、“FooBar”(这个词在索引中)和“FooBar”(两个词都在索引中)

这里的主要问题是不能同时对两种类型的查询使用精确的阶段匹配。即。如果您搜索
“Bar BazQux”
“Bar Baz Qux”
,您将得到一个结果。但是对于
“Bar Baz Qux”
你将一无所获。在我的具体案例中,这不是一个问题,但对于任何想使用这种方法的人来说——我已经警告过你了

如果您知道更好的方法来做这件事,或者这个解决方法有一些缺点,我错过了,请让我知道


另一种可能的解决方案是使用如图所示的三角图。这种方法也有助于解决用户可能犯的错误,但更难实现