【问题标题】:Haystack scores make no sense干草堆得分毫无意义
【发布时间】:2016-06-08 15:22:19
【问题描述】:

我正在使用 haystack 和弹性搜索来搜索项目,但我得到的分数没有意义(对我来说)。

我尝试索引和搜索的模型类似于:

class Car(models.Model):
    name = models.CharField(max_length=255)

class Color(models.Model):
    car = models.ForeignKey(Car)
    name = models.CharField(max_length=255)

还有搜索索引,即使我对汽车感兴趣,我也想按颜色搜索它们,因为我想专门显示该颜色的图片:

class CarIndex(indexes.SearchIndex, indexes.Indexable):
    text = CharField(document=True)

    def get_model(self):
        return Color

    def prepare_text(self, obj):
        # Some cleaning
        return " ".join([obj.name, obj.car.name])

现在我添加了三种颜色的汽车,即红色、黑色和白色的 LaFerrari。只有一种型号的汽车,用于搜索的有 3 辆汽车。

所以我检查了 Kibana,我得到了正常的输出。

然后我执行正常搜索:LaFerrari

所有三个模型都有相同的信息,仅更改文本字段上的颜色名称。我什至尝试从文本中删除颜色,猜猜我得到了什么。

在这次惨败之后,我尝试了python elasticsearch库,结果正常(手动索引和搜索),如果我搜索LaFerrari,所有三种颜色的分数都是一样的。

知道发生了什么吗?

我正在考虑从 haystack 迁移到普通的 elasticsearch,有什么建议吗?

【问题讨论】:

  • 这是错字吗? def get_model(self): return Color - 这不应该是return Car吗?
  • @Risadinha 这不是错字,我想按颜色索引,有点混乱,但对于我想要的搜索模型,可以。
  • 是的,我意识到你所称的 ColorCar,而你所称的 Car 类似于 Brand。最重要的是,您将索引命名为 CarIndex,这使得它更加混乱。

标签: django elasticsearch django-haystack


【解决方案1】:

如果您想更明确地搜索,您应该在索引中添加两个字段:

  • 颜色(这实际上是类似于white 的颜色,但是您可以命名模型和属性)
  • 名称(品牌名称)

包罗万象的文档字段只能为您提供到目前为止的信息。您必须这样做,以便 Elasticsearch 使用 DisMax 查询并搜索给定搜索词的所有配置字段。

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/query-dsl-dis-max-query.html

到目前为止,我只使用了SearchQuerySet+Elastic(基于包罗万象的领域)(以及很多自定义+Solr)。虽然 SearchQuerySet 非常适合 Django ORM,但它只能让你走这么远。因此,您可能必须使用自定义代码进行查询,这可能是对的。不过,我仍然会推荐使用 Haystack 进行索引(它可能会更慢但很容易设置和维护)。

看看你的例子,你在不同领域的收获将是:

您搜索Laferrari,这是在字段name(或brand_name)的所有三个文档中找到的确切值。结果将具有相同的分数。

不同的字段还可以让您使用构面:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-facets.html#search-facets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多