前缀自动完成建议elasticsearch

时间:2017-04-14 22:09:28

标签: elasticsearch autocomplete

我正在尝试使用ElasticSearch实现前缀自动完成功能,这是我对建议字段的映射:

PUT vdpinfo
{
    "mappings": {
        "details" : {
            "properties" : {
                "suggest" : {
                    "type" : "completion"
                },
                "title": {
                  "type": "keyword"
                }
            }
        }
    }
}

我用单字和双字(bigram)索引了一些数据,例如:

{"suggest": "leather"}

还有:

{"suggest": "leather seats"}
{"suggest": "2 leather"}

我的搜索查询是这样的:

GET /vdpinfo/details/_search
{
        "suggest": {
            "feature-suggest": {
                "prefix": "leather",
                "completion": {
                    "field": "suggest"
                }
            }
        }
    }

但结果同时返回{"suggest": "leather"}{"suggest": "2 leather"},更重要的是,{"suggest": "2 leather"}的排名高于leather

我的问题是为什么2 leather会被返回,为什么它不像查询中那样prefix自动完成。 prefix: leather

1 个答案:

答案 0 :(得分:2)

这是因为用于分析数据的默认分析器是simple分析器,只要遇到不是字母的字符就会将文本分解为术语,因此2 leather实际上是leather索引为simple,因此显示结果的原因(以及它首先显示的原因)。

他们默认使用standard分析器而不是standard分析器的原因是不提供基于停用词(explanation here)的建议。

因此,如果您使用2 leather分析器,则无法获得PUT vdpinfo { "mappings": { "details" : { "properties" : { "suggest" : { "type" : "completion", "analyzer" : "standard" }, "title": { "type": "keyword" } } } } }

的任何建议
class Post(models.Model):
   owner = models.ForeignKey(User, on_delete=models.CASCADE)
   title = models.CharField(max_length=200)
   slug = models.SlugField(unique=True)
   autor = models.CharField(max_length=200)
   description = models.TextField()
   likes = models.PositiveIntegerField(default=0)
   created_date = models.DateTimeField(default=timezone.now)
   published_date = models.DateTimeField(blank=True, null=True)
   files = models.FileField(upload_to=upload_location, validators=
                   [validate_file_extension])
   post_type = models.CharField(max_length=100, choices=Book_Type_Choices)
   tags = TaggableManager()