gpt4 book ai didi

django - Elasticsearch dsl术语过滤器不适用于字符串字段

转载 作者:行者123 更新时间:2023-12-02 22:43:36 25 4
gpt4 key购买 nike

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

这是我的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'_type': 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': u'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': 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'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')

输出:

[]

最佳答案

username的机会是text fieldTerm查询将查找完全匹配的内容,即它将查找具有 jackie@example.com的 token
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创建字段rawusername版本,然后在该字段上应用term查询。

  • 希望这可以帮助!

    关于django - Elasticsearch dsl术语过滤器不适用于字符串字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44096694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com