elasticsearch-dsl-py,Django,elasticsearch Dsl Py" /> elasticsearch-dsl-py,Django,elasticsearch Dsl Py" />

使用django elasticsearch dsl搜索NestedField

使用django elasticsearch dsl搜索NestedField,django,elasticsearch-dsl-py,Django,elasticsearch Dsl Py,我不知道如何使用嵌套字段进行搜索。 我首先想用PK过滤结果,然后从一个或多个单词中搜索几个字段。 我创建了一个nestedfield,因为关系是“manytomy” 我的模型: 班级俱乐部(models.Model): """ 运动俱乐部模型,与:模型:`auth.User`和:模型:`clubs.CategoryClub相关` """ name=models.CharField(最大长度=50,详细名称=“nom”) category=models.ForeignKey('CategoryCl

我不知道如何使用嵌套字段进行搜索。 我首先想用PK过滤结果,然后从一个或多个单词中搜索几个字段。 我创建了一个nestedfield,因为关系是“manytomy”

我的模型:

班级俱乐部(models.Model):
"""
运动俱乐部模型,与:模型:`auth.User`和:模型:`clubs.CategoryClub相关`
"""
name=models.CharField(最大长度=50,详细名称=“nom”)
category=models.ForeignKey('CategoryClub',on_delete=models.CASCADE)
clubs\u members=models.ManyToManyField(用户,相关的\u name=“clubs\u members”,blank=True)
token=models.CharField(max_length=8,unique=True,blank=True,null=True)
类元:
详细名称=“俱乐部”
详细名称复数=“俱乐部”
定义(自我):
返回self.name
def get_绝对_url(自身):
返回反向(“detailClub”,kwargs={“pk”:self.pk})
我的文件:

@registry.register\u文件
类用户文档(文档):
clubs\u members=fields.NestedField(属性={
“pk”:字段。整型字段(),
“名称”:字段。TextField(),
})
类别索引:
#Elasticsearch索引的名称
名称='用户'
#有关可用设置,请参见Elasticsearch索引API参考
设置={'number_of_shard':1,
“复制副本的数量”:0}
Django类:
模型=用户#与此文档关联的模型
#要在Elasticsearch中索引的模型字段
字段=[
“id”,
“名字”,
“姓”,
“电子邮件”,
]
我的看法是:

search=UserDocument.search()
search=search.query(
'嵌套',
path='clubs\'会员',
query=Q('match',clubs\u members\u pk=request.user.profile.club\u administrator.pk)
#在我的示例中,request.user.profil.club_administrator.pk==1
)
if form.cleaned_数据['search']!="":
search=search.query(
Qeltic(‘bool’,
应该=[
QELAST(‘多重匹配’,
query=form.cleaned_数据['search'],
字段=[“姓氏^2”,“名^2”,“电子邮件^1'],
fuzziness=“自动”
),
],
最小应匹配=1
)
)
response=search[start:end].execute()
ES中的文档示例:

{
“_索引”:“用户”,
“\u类型”:“\u单据”,
“_id”:“1”,
“_版本”:1,
“_seq_no”:0,
“_primary_term”:1,
“发现”:正确,
“_来源”:{
“profil”:{
“电话”:“010101011”,
“地址”:“市中心”,
“城市”:“纽约”,
“postalCode”:“555”,
“头像”:“/media/avatars/2.jpg”
},
“俱乐部成员”:[
{
"pk":1,,
“名称”:“网球俱乐部”
},
{
"pk":2,,
“名称”:“足球俱乐部”
}
],
“id”:1,
“名字”:“Django”,
“姓”:“费特”,
“电子邮件”:django@fett.com"
}
}
回溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/dashboard/recherche/

Django Version: 2.2.16
Python Version: 3.8.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admindocs',
 'django_elasticsearch_dsl',
 'django_elasticsearch_dsl_drf',
 'easy_thumbnails',
 'bootstrap4',
 'bootstrap_datepicker_plus',
 'debug_toolbar',
 'paypal.standard.ipn',
 'customfilters',
 'utilisateurs',
 'clubs',
 'dashboard',
 'teams',
 'blog',
 'competition',
 'ideasbox',
 'paiement']
Installed Middleware:
['debug_toolbar.middleware.DebugToolbarMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/utils.py" in get_dsl_class
  219.             return cls._classes[name]

During handling of the above exception (<Q: (AND: match, ('clubs_members__pk', 1))>), another exception occurred:

File "/home/aurelien/.local/lib/python3.8/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/aurelien/.local/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/home/aurelien/.local/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/aurelien/dev/gsport/dashboard/views.py" in search
  1154.             search = search.query(

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/search.py" in __call__
  43.             proxied._proxied = Q(*args, **kwargs)

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/query.py" in Q
  34.     return Query.get_dsl_class(name_or_query)(**params)

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/utils.py" in __init__
  230.             self._setattr(pname, pvalue)

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/utils.py" in _setattr
  283.                     value = shortcut(value)

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/query.py" in Q
  34.     return Query.get_dsl_class(name_or_query)(**params)

File "/home/aurelien/.local/lib/python3.8/site-packages/elasticsearch_dsl/utils.py" in get_dsl_class
  223.             raise UnknownDslObject('DSL class `{}` does not exist in {}.'.format(name, cls._type_name))

Exception Type: UnknownDslObject at /dashboard/recherche/
Exception Value: DSL class `(AND: match, ('clubs_members__pk', 1))` does not exist in query.
环境:
申请方式:邮寄
请求URL:http://127.0.0.1:8000/dashboard/recherche/
Django版本:2.2.16
Python版本:3.8.6
已安装的应用程序:
['django.contrib.admin',
“django.contrib.auth”,
“django.contrib.contenttypes”,
“django.contrib.sessions”,
“django.contrib.messages”,
“django.contrib.staticfiles”,
“django.contrib.admindocs”,
“django_elasticsearch_dsl”,
“django_elasticsearch_dsl_drf”,
“简易缩略图”,
“bootstrap4”,
“bootstrap\u datepicker\u plus”,
“调试工具栏”,
“paypal.standard.ipn”,
“自定义筛选器”,
“利用者”,
“俱乐部”,
“仪表板”,
“团队”,
“博客”,
"竞争",,
“ideasbox”,
“付款”]
已安装的中间件:
['debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.security.SecurityMiddleware',
“django.contrib.sessions.middleware.SessionMiddleware”,
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xframeoptions中间件']
回溯:
get_dsl_类中的文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch_dsl/utils.py”
219返回cls.\u类[名称]
在处理上述异常()期间,发生了另一个异常:
文件“/home/aurelian/.local/lib/python3.8/site packages/django/core/handlers/exception.py”,位于内部
34响应=获取响应(请求)
文件“/home/aurelian/.local/lib/python3.8/site-packages/django/core/handlers/base.py”位于\u get\u响应中
115response=self.process\u异常\u由\u中间件(e,请求)
文件“/home/aurelian/.local/lib/python3.8/site-packages/django/core/handlers/base.py”位于\u get\u响应中
113响应=包装的回调(请求,*回调参数,**回调参数)
搜索中的文件“/home/aurelian/dev/gsport/dashboard/views.py”
1154search=search.query(
调用中的文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch\u dsl/search.py”__
43.代理。_proxied=Q(*args,**kwargs)
Q中的文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch_dsl/query.py”
34.返回查询。获取\u dsl\u类(名称或\u查询)(**参数)
init中的文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch\u dsl/utils.py”__
230.self._setattr(pname,pvalue)
文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch\u dsl/utils.py”位于
283.值=快捷方式(值)
Q中的文件“/home/aurelian/.local/lib/python3.8/site packages/elasticsearch_dsl/query.py”
34.返回查询。获取\u dsl\u类(名称\u或\u查询)