我使用干草堆进行弹性搜索项目,但我得到的分数对我来说毫无意义。
我尝试索引和搜索的模型看起来类似于:
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
,这三种颜色的得分都相同。
知道发生了什么事吗?
我正在考虑从干草堆转向普通弹性搜索,是否有任何建议?
答案 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