我正在尝试使用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
?
答案 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()