我正在尝试对弹性搜索返回的结果进行排序,以使其与用户更加相关。
我有一个大型数据库(超过100M个项目),我需要按名称搜索它们,同时允许出现拼写错误(模糊性为1)。
例如,当我搜索“跳转”时,结果为: -“凹凸” -“凹凸1” -“凹凸2” -... -“跳” -“跳1” -“跳2”
我正在寻找2件东西: -一种显示每场比赛得分的方法 -一种按分数排序结果的方法,以便“跳跃”在“碰撞”之前。
documents / product.py
from django_elasticsearch_dsl import DocType, Index, fields
from elasticsearch_dsl import analyzer
from main.models import Product
product = Index('products')
product.settings(
number_of_shards=1,
number_of_replicas=0
)
text_analyzer = analyzer(
'text_analyzer',
tokenizer='standard',
filter=[
'asciifolding',
'lowercase',
'snowball',
'stop',
]
)
@product.doc_type
class ProductDocument(DocType):
name = fields.TextField(analyzer=text_analyzer)
class Meta:
model = Product
fields = [
'code',
]
queryset_pagination = 5000
def prepare_name(self, instance):
if instance.name:
return instance.name.replace('-', ' ').replace('_', ' ')
else:
return None
search.py
from ..documents import ProductDocument
from elasticsearch_dsl import Q
def search(searched_text):
name_options = {
"query": searched_text,
"operator": "and",
"fuzziness": "1",
}
query = Q("match", name=name_options) \
| Q("match", code=searched_text)
s = ProductDocument.search().filter(query)
s = s[0:1000]
return s.to_queryset()