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

时间:2016-02-26 15:09:42

标签: ruby-on-rails postgresql elasticsearch data-analysis searchkick

我想使用Elasticsearch来分析数据并将其显示给用户。

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

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

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

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

Rails中的Elasticsearch / Searchkick是否可行,或者我应该使用其他方法来分析数据?

2 个答案:

答案 0 :(得分:3)

在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中构建这些查询,手动指定搜索请求的主体。

答案 1 :(得分:0)

阅读使用More Like This Query。这是product.similar()生成的查询。它仅在文本字段上运行。如果您还想比较数字或日期字段,则必须将这些规则合并到scoring script中,以执行您要求的操作。