配置Sphinx以处理空间尽可能的单词分隔符

时间:2014-07-09 21:07:52

标签: sphinx

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

Foo Bar Baz-Qux
Foo BazQux Bar
Baz Qux Foo Bar

目前我的短划线符号为ignore_chars设置的值,而Sphinx为前两个查询提供结果,但不提供第三个查询。

请注意,解决方案必须是一般性的,不得依赖示例中的特定字词或相关订单。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

...
ignore_chars = -
regexp_filter = \b([\w\d]+)-([\w\d]+)\b => \1\2 \1 \2
...

因此,在Sphinx将文本放入其索引之前,它会将所有包含破折号的单词拆分为两种形式:第一种是简单删除破折号,第二种是破折号替换为空格。在索引创建的那一刻,文本“Foo-Bar”的三个单词将被编入索引:“FooBar”,“Foo”和“Bar”。这让我可以使用以下任何一个查询进行搜索:“Foo-Bar”(短划线将被删除,因为它位于ignore_chars列表中),“FooBar”(这个词在索引中)和“Foo Bar” (这两个词都在索引中)。

这里的主要问题是您不能同时对两种类型的查询使用精确相位匹配。 I. e。如果您搜索"Bar BazQux""Bar Baz-Qux",您将获得结果。但对于"Bar Baz Qux",你什么也得不到。在我的具体情况下,这不是一个问题,但对于任何想要使用这种方法的人 - 我都警告过你。

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


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