我正在尝试使用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')
输出:
[]
答案 0 :(得分:4)
username
字段可能是text field
。 Term
查询查找完全匹配,即它会查找带有 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
。
raw
的{{1}}版本,然后在该字段上应用username
查询。希望这有帮助!