为了账号安全,请及时绑定邮箱和手机立即绑定

如何告诉 ElasticSearch 多匹配查询我希望以字符串形式存储的数值字段返回带有数值字符

如何告诉 ElasticSearch 多匹配查询我希望以字符串形式存储的数值字段返回带有数值字符

侃侃无极 2022-09-13 20:03:29
我正在编写一个 Flask 应用程序,并且正在使用弹性搜索。这里是:search.pyfrom flask import current_appdef query_object(index, fields, query, page, per_page, fuzziness=0):    search = current_app.elasticsearch.search(        index=index,        body={'query': {'multi_match': {'query': str(query), 'fields': fields, 'fuzziness': fuzziness, 'lenient': True}},                'from': (page - 1) * per_page, 'size': per_page}    )    ids = [int(hit['_id']) for hit in search['hits']['hits']]    return ids, search['hits']['total']['value']以下模型已编制索引:class WishList(db.Model, SearchableMixin):    __searchable__ = ['first_name', 'gender', 'wants', 'needs', 'wear',    'read', 'shoe_size_category', 'shoe_type', 'sheet_size', 'additional_comments', 'time_chosen',    'age', 'shoe_sock_size', 'program_number']    id = db.Column(db.Integer, primary_key=True)    program_number = db.Column(db.String(4))    first_name = db.Column(db.String(20))    age = db.Column(db.String(10))    gender = db.Column(db.String(20))    wants = db.Column(db.String(300))    needs = db.Column(db.String(300))    wear = db.Column(db.String(300))    read = db.Column(db.String(300))    pant_dress_size = db.Column(db.String(20), default='unspecified')    shirt_blouse_size = db.Column(db.String(20), default='unspecified')    jacket_sweater_size = db.Column(db.String(20), default='unspecified')    shoe_sock_size = db.Column(db.String(20), default='unspecified')    shoe_size_category = db.Column(db.String(20), default='unspecified')当我当前搜索它时,所有字段都是可搜索的,并返回有效的结果,除非我使用数字值进行搜索。
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

由于在数据类型上使用参数,然后使用true使其工作,如此链接中所述,因此发生了此问题。fuzzinessnumericlenientremoves format-based errors, such as providing a text query value for a numeric field, are ignored.


下面是您在尝试在数值数据类型上使用时遇到的错误。fuzziness


原因“:”只能对关键字和文本字段使用模糊查询 - 不能对类型为 [整数] 的 [age] 使用模糊查询”


当您添加 时,上述错误会消失,但不会返回任何文档。"lenient" : true


要使其正常工作,只需从搜索查询中删除和参数,它就可以工作,因为 Elasticsearch 会自动将有效转换为有效值,反之亦然,如强制文章中所述。fuzzinesslenientstringnumeric


使用 REST API 显示它的工作示例

指数定义

{

    "mappings": {

        "properties": {

            "age" :{

                "type" : "integer"

            }

        }

    }

}

索引示例文档

{

  "age" : "25" --> note use of `""`, sending it as string

}


{

  "age" : 28 :- note sending numneric value

}

字符串格式的搜索查询

{

    "query": {

        "bool": {

            "must": [

                {

                    "multi_match": {

                        "query": "28", --> note string format

                        "fields": [

                            "age" --> note you can add more fields

                        ]

                    }

                }

            ]

        }

    }

}

搜索结果

"hits": [

      {

        "_index": "so_numberic",

        "_type": "_doc",

        "_id": "1",

        "_score": 1.0,

        "_source": {

          "program_number": "123456789",

          "age": "28"

        }

      }

    ]

数字格式的搜索查询

{

    "query": {

        "match" : { --> query on single field.

            "age" : {

                "query" : 28 --> note numeric format

            }

        }

    }

}

结果

"hits": [

      {

        "_index": "so_numberic",

        "_type": "_doc",

        "_id": "1",

        "_score": 1.0,

        "_source": {

          "program_number": "123456789",

          "age": "28"

        }

      }

    ]

如前所述,显示您的 和 不会带来任何结果。fuzzinesslenient


搜索查询

{

    "query": {

        "match": {

            "age": {

                "query": 28,

                "fuzziness": 2,

                "lenient": true

            }

        }

    }

}

结果

{

    "took": 1,

    "timed_out": false,

    "_shards": {

        "total": 1,

        "successful": 1,

        "skipped": 0,

        "failed": 0

    },

    "hits": { --> note 0 results.

        "total": {

            "value": 0,

            "relation": "eq"

        },

        "max_score": null,

        "hits": []

    }

}


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号