Elasticsearch DSL术语过滤器不适用于字符串字段

Ran*_*han 1 django python-2.7 elasticsearch

我正在尝试term使用elasticsearch_dslpython客户端应用过滤器弹性搜索索引数据,但不适用于字符串字段。

这是我的ES索引数据:

s = Search(using=es, index='idx_object', doc_type='ip').source(include=['id', 'status', 'username'])
Run Code Online (Sandbox Code Playgroud)

[{u'_score':1.0,u'_type':u'ip',u'_id':u'79',u'_source':{u'status':u'PUBLISHED',u'username': u'jackie @ example.com',u'id':79},u'_index':u'idx_object'},{u'_score':1.0,u'_type':u'ip',u'_id' :u'84',u'_source':{u'status':u'PUBLISHED',u'username':u'julia@example.com',u'id':84},u'_index':u 'idx_object'},{u'_score':1.0,u'_type':u'ip',u'_id':u'73',u'_source':{u'status':u'PUBLISHED',u '用户名':u'brad@example.com',u'id':73},u'_index':u'idx_object'},{u'_score':1.0,u'_type':u'ip',你_id':u'82',u'_source':{u'status':u'PUBLISHED',u'username':u'julia @ example.com',u'id':82},u'_index' :u'idx_object'},{u'_score':1.0,u'_type':u'ip',u'_id':u'65',u'_source':{u'status':u'PUBLISHED' ,u'用户名':u'george@example.com',u'id':65},u'_index':u'idx_object'},{u'_score':1.0,u'_type':u'ip ',u'_id':u'78',u'_source':{u'status':u'PUBLISHED',u'username':u'julia@example.com',u'id':78}, u'_index':u'idx_object'},{u'_score':1.0,u'_type':u'ip',u'_id':u'62',u'_source':{u'status':u'PUBLISHED',u'username':u'brad @ example.com',u'id':62},u'_index':u'idx_object'},{u'_score':1.0,u'_type' :u'ip',u'_id':u'96',u'_source':{u'status':u'PUBLISHED',u'username':u'brad@example.com',u'id' :96},u'_index':u'idx_object'},{u'_score':1.0,u'_type':u'ip',u'_id':u'70',u'_source':{u '状态':u'发布',u'用户名':u'brad@example.com',u'id':70},u'_index':u'idx_object'},{u'_score':1.0, u'_type':u'ip',u'_id':u'80',u'_source':{u'status':u'PUBLISHED',u'username':u'george @ example。com',u'id':80},u'_index':u'idx_object'}]

现在,如果我在id整数字段中应用了过滤器,则它可以正常工作。

s = Search(using=es, index='idx_object', doc_type='ip').source(include=['id', 'status', 'username']).filter("term", id=79)
Run Code Online (Sandbox Code Playgroud)

输出:

[{u'_score':0.0,u'_type':u'ip',u'_id':u'79',u'_source':{u'status':u'PUBLISHED',u'username': u'jackie @ example.com',u'id':79},u'_index':u'idx_object'}]

现在,如果我对用户名字符串字段应用过滤器,则无法正常工作:

s = Search(using=es, index='idx_object', doc_type='ip').source(include=['id', 'status', 'username']).filter("term", username='jackie@example.com')
Run Code Online (Sandbox Code Playgroud)

输出:

[]

Ric*_*cha 5

机会是username领域text fieldTerm查询查找精确匹配,即它会寻找一个令牌jackie@example.comreverse index

如果您使用ES 5.x,则可以尝试将查询更改为

s = Search(using=es, index='idx_object', doc_type='ip').source(include=['id', 'status', 'username']).filter("term", username.keyword='jackie@example.com')
Run Code Online (Sandbox Code Playgroud)

如果ES版本< 5.x

  • 如果要完全匹配,则可以使用多字段创建字段raw版本,username然后term对该字段应用查询。

希望这可以帮助!