我想使用Elasticsearch来分析数据并将其显示给用户。
当用户查看模型的记录时,我想显示一个类似的'数据库中该模型的记录以及相似性的百分比。这将匹配模型上的每个字段。
我知道使用Searchkick gem我可以使用命令查找类似的记录:
product = Product.first
product.similar(fields: ["name"], where: {size: "12 oz"})
我想更进一步,比较整个记录(最终是关联)。
Rails中的Elasticsearch / Searchkick是否可行,或者我应该使用其他方法来分析数据?
答案 0 :(得分:3)
在Elasticsearch中有一个专门为此目的而构建的功能,称为more_like_this
。 mlt查询的文档详细介绍了如何实现您想要做的事情。
您将分析您提供给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中,以执行您要求的操作。