使用python elasticsearch-dsl在Elasticsearch字段名称中使用多个下划线

时间:2018-06-26 19:19:04

标签: elasticsearch elasticsearch-dsl-py

我试图理解为什么带有单个下划线mods_genre的字段的行为与带有下划线1+的字段的行为不同,例如mods__genre使用python elasticsearch-dsl client时。

使用ElasticSearch版本5.5.1和python 3.5

以下是我用来选择字段与值匹配的所有文档的代码。

此示例正在搜索索引foo,其字段名称仅带有下划线,并按预期返回结果(如我已确认此字段填充了该值):

# query against index with single underscores in field name
query = Search(using=es_handle, index='foo')
query = query.filter(Q('term', **{'%s.keyword' % 'mods_genre' : 'biography'}))
query_results = query.execute()

In [16]: query_results.hits.total
Out[16]: 6

但是,使用非常相似的代码,但是查询索引中具有连续多个下划线的字段名称的索引bar,我得到的结果为零:

# query against index with multiple underscores in field name
query = Search(using=es_handle, index='bar')
query = query.filter(Q('term', **{'%s.keyword' % 'mods__genre' : 'biography'}))
query_results = query.execute()

In [16]: query_results.hits.total
Out[16]: 0

对为什么会这样的任何见解?我知道以下划线开头的字段名称是保留的,但并没有偶然发现任何表明该字段内的下划线的文档(特别是连续多个下划线)会出现问题。

1 个答案:

答案 0 :(得分:1)

这仅仅是因为elasticsearch-dsl-py用点__替换了字段名中的双下划线.。可以在utils.py中的第222-223行看到。因此,基本上,第二个查询实际上是在mods.genre.keyword上进行的,这可能不是您期望的。

有关该上下文的更多信息,请参见issue #28,但基本上,他们希望采用与Django CRM类似的概念。