ruby-on-rails - 如何根据 sphinx 中的多个因素获得搜索排名?

标签 ruby-on-rails ruby search-engine sphinx

大家好 stackoverflow,

我们有一个不断发展壮大的 Rails 项目,现在我们在搜索中遇到了第一个性能问题,因为我们不知道如何正确地利用 sphinx 来满足我们的需求。 我们有类似“Java PHP Software developer”的搜索查询。我们现在的问题是排名应该适用于多种情况。

作为搜索字段,我们有标签列表、描述和标题。 如果其中一个术语在其中一个字段内,它应该得到例如 2 分。如果它在多个字段中,则更多点,但如果它在同一字段中不止一次,则不是多个点。 下一个问题是我有一个大文件,其中的同义词也应该被检查。它看起来像这样:

Java > Java
Java-EE > Java
...

因此,如果发现 Java-EE,它也应该得到一些分数,但会因为是同义词而受到惩罚。

最大点数为 5,如显示的 5 颗星。 任何快速的解决方案都会很好,因为目前它是在普通的 ruby​​ 中完成的,而且速度会变慢,因为我们无法在 sphinx 中正确排名。

如果有其他搜索引擎的解决方案也很好,因为它可以更改。

提前感谢所有的努力。欢迎所有拼写更正和问题以清除问题。

最佳答案

大多数性能问题都可以通过改变您使用 sphinx 的方式来解决。首先,您需要解决如何在 sphinx 中索引数据。在索引期间做一些处理将使搜索更快,结果更相关。其次,处理搜索词,最后但同样重要的是,决定要使用的排名算法。

我将使用“标题”字段作为示例,但可以为所有字段复制逻辑。

索引

向 sphinx 添加两个字段(“title”和“title_synonyms”)。对于数据库中的每条记录,请执行以下操作:-

  • 对单词执行 DISTINCT 以删除重复项(“Ruby Developer/Java Developer”将变为“Ruby Developer/Java”。这将阻止记录在搜索时获得两个重复分数。这进入“标题”

  • 取上面的 DISTINCT 标题并用扩展的同义词替换所有单词。我建议将同义词放在数据库中以使扩展更容易。然后文本将变为“Ruby Developer/Java-EE”。每个单词都必须替换为所有同义词。如果 Java 有两个同义词,则它们都必须在字段中。这进入“title_synonyms”

搜索

因为现在 sphinx 中有两个字段,我们可以给它们每个不同的权重; “title”的权重为“10”,“title_synonyms”的权重为“3”。这意味着一条记录必须匹配 4 个同义词,然后它的排名才能高于原始标题的同义词。您可以根据自己的需要调整权重。

假设用户正在搜索“Java Developer”。对于搜索短语,请执行以下操作:-

  • 删除重复的词
  • 获取搜索短语中每个单词的同义词
  • 将 Sphinx 中的匹配模式设置为 SPH_MATCH_EXTENDED

上面的规则意味着在 sphinx 中的搜索看起来像这样:-

@title "Java 开发人员"| @title_synonyms "Java-EE"

如果您想对完全匹配的排名高于词素,搜索查询将如下所示:-

@title ("Java Developer"| "=Java =Developer") | @title_synonyms ("Java-EE"| "=Java-EE")

不过,您需要使用 SPH_RANK_PROXIMITY_BM25 或 SPH_RANK_SPH04 才能使其正常工作。

排名

您可以尝试任何内置的排名算法来查看结果。我推荐 SPH_RANK_MATCHANY 或 SPH_RANK_WORDCOUNT 作为开始。

对于接近度和完全匹配排名,请使用 SPH_RANK_PROXIMITY_BM25、SPH_RANK_SPH04 或 SPH_RANK_EXPR,您可以在其中使用自己的算法。

结论

您现在应该有一个既快速又准确的搜索。您的 Ruby 应用程序只需完成很少的工作,大部分工作都在 sphinx 内部完成(它应该在的地方)。

希望这有助于...

关于ruby-on-rails - 如何根据 sphinx 中的多个因素获得搜索排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10153532/

相关文章:

ruby-on-rails - Rails 路由开始斜杠

javascript - 如何让浏览器检测到哈希更改

ruby - 在日志文件上运行 tail 的 ruby​​ 脚本?

ruby-on-rails - 在 Windows 上使用 Cygwin 安装 RVM - Curl 抛出状态 23

ruby-on-rails - ElasticSearch 搜索多种类型

ruby-on-rails - Ruby Mongo 或 Mongoid 并发问题

ruby-on-rails - 在另一个 Controller 的显示操作中将多步表单向导的第一步呈现为部分

Ruby 参数 SyntaxError with varargs

python - 如何使用python mysql实现搜索引擎?

search-engine - 是否有搜索引擎可以搜索您输入的确切单词,以及您输入它们的方式?