使用 Elasticsearch 和 Rails 分析模型数据的相似性

Analyze similarities in model data using Elasticsearch and Rails

我想使用Elasticsearch 来分析数据并展示给用户。

当用户查看模型的记录时,我想显示数据库中该模型的 'similar' 记录列表,以及相似度百分比。这将匹配模型中的每个字段。

我知道使用 Searchkick gem 我可以使用命令来查找类似的记录:

product = Product.first
product.similar(fields: ["name"], where: {size: "12 oz"})

我想更进一步,比较整个记录(以及最终的关联)。

这在 Rails 中使用 Elasticsearch / Searchkick 可行吗?还是我应该使用其他方法来分析数据?

阅读有关使用 More Like This Query. This is the query produced by product.similar(). It operates only on text fields. If you also want to compare numeric or date fields, you'll have to incorporate these rules into a scoring script 完成您所要求的内容的信息。

Elasticsearch 中有一个专门为此目的构建的功能,称为 more_like_thismlt 查询的文档详细介绍了如何准确地实现您想要做的事情。

您提供给 like 字段的内容将被分析,每个字段最相关的术语将用于检索包含尽可能多的相关术语的文档。如果您将所有记录都存储在 Elasticsearch 中,则可以使用 Multi GET syntax 将索引中已有的文档指定为 like 字段的内容,如下所示:

    "like" : [
      {
        "_index" : "model",
        "_type" : "model",
        "_id" : "1"
      }
    ]

请记住,在使用此语法时不能使用索引别名(因此,如果您不确定文档当前位于哪个索引中,则必须先进行文档查找)。

如果您不指定 fields 字段,将使用源文档中的所有字段。为了避免意外,我的建议是始终指定要匹配的 fields 相似文档的列表。

如果您有想要与源文档完美匹配的非文本字段,您可能需要考虑使用 bool 查询,以编程方式创建 filter 部分以限制返回的文档通过 mlt 查询仅对整个索引的过滤子集进行查询。

您可以使用 advanced search 功能在 Searchkick 中构建这些查询,手动指定搜索请求的正文。