2016-06-08 79 views
1

我使用干草堆进行项目的弹性搜索,但是我得到的分数对我来说没有任何意义。干草堆分数没有意义

我想索引和搜索的模式类似于:

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

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

而搜索索引,即使我感兴趣的汽车,我想通过颜色来搜索他们,因为我想显示颜色的PIC明确:

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

这场惨败之后,我尝试了蟒蛇elasticsearch库,和我平时成绩(上工索引和搜索),所有三种颜色具有相同的分数,如果我的LaFerrari执行搜索。

任何想法是怎么回事?

我正在考虑从干草堆转到普通elasticsearch,有什么建议吗?

+0

这是一个错字? 'def get_model(self):return Color' - 不应该这样读'return Car'? – Risadinha

+0

@Risadinha这不是一个错字,我想通过Color进行索引,这有点令人困惑,但是对于我想要的搜索模式,作品。 – Marti

+0

是的,我意识到你所说的'Color'是'Car',而你所说的'Car'就像'品牌'。最重要的是,你将索引命名为“CarIndex”,这使得它更加令人困惑。 – Risadinha

回答

1

如果你想搜索更醒目,你应该两个字段添加到索引:

  • 颜色(这是真的很喜欢white颜色然而,要对模型和属性)
  • 名(品牌名称)

捕获全部文档字段将只有你到目前为止。您必须做到这一点,以便Elasticsearch使用DisMax查询并在给定搜索条件的所有配置字段上进行搜索。

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

我只用了SearchQuerySet +弹性(基于捕获所有领域)至今(和定制+ Solr的很多)。虽然SearchQuerySet非常适合Django ORM,但它只会帮助你。所以,您可能需要使用自定义代码进行查询。尽管如此,我仍然会推荐Haystack进行索引(它可能会比较慢但是很容易设置和维护)。在你的榜样

看,你用不同的领域获得这将是:

您搜索Laferrari,这是在该领域name(或brand_name)所有三种文档中找到准确的数值。结果将得到相同的分数。

不同的领域也可让您使用方面:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-facets.html#search-facets