干草堆得分毫无意义

时间:2016-06-08 15:22:19

标签: django elasticsearch django-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,我得到了正常的输出。

kibana empty

然后我执行普通搜索:LaFerrari

kibana weird score

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

kibana weird 2

在这次惨败之后,我尝试了python elasticsearch库,我得到了正常的结果(做手动索引和搜索),如果我搜索了LaFerrari,这三种颜色的得分都相同。

知道发生了什么事吗?

我正在考虑从干草堆转向普通弹性搜索,是否有任何建议?

1 个答案:

答案 0 :(得分:1)

如果您想更有特色地搜索,您应该在索引中再添加两个字段:

  • 颜色(这实际上是像white的颜色,但是你命名了模型和属性)
  • 名称(品牌名称)

catch-all文档字段只会到达目前为止。您必须这样做,以便Elasticsearch使用DisMax查询并在所有已配置的字段上搜索给定的搜索词。

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

到目前为止,我只使用了SearchQuerySet + Elastic(基于catch-all字段)(以及自定义+ Solr)。虽然SearchQuerySet非常适合Django ORM,但它只能让你到目前为止。因此,您可能必须使用自定义代码进行查询。我仍然会建议使用Haystack进行索引(它可能更慢但很容易设置和维护)。

看看你的例子,你获得的不同领域是:

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

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