Elasticsearch dsl Term Filter不使用字符串Field

时间:2017-05-21 12:11:39

标签: django python-2.7 elasticsearch

我正在尝试使用term python客户端应用elasticsearch_dsl过滤弹性搜索索引数据,但它不能使用字符串字段。

这是我的ES索引数据:

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

[{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'ip',u'_id':u'73',u'_source':{u'status':u'PUBLISHED ',u'username':u'brad @ example.com',u'id':73},u'_index':u'idx_object'},{u'_score':1.0,u'_type':你' ip',u'_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'username':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':你' 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'status':u'PUBLISHED',u'username':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)

输出:

  

[{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')

输出:

  

[]

1 个答案:

答案 0 :(得分:4)

username字段可能是text fieldTerm查询查找完全匹配,即它会查找带有 jackie@example.com 的令牌 在reverse 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')

在ES版本< 5.x

  • 如果您想要完全匹配您可以使用multi-field创建字段raw的{​​{1}}版本,然后在该字段上应用username查询。

希望这有帮助!