猿问

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

我正在编写一个 Flask 应用程序,并且正在使用弹性搜索。


这里是:search.py


from flask import current_app


def 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')


当我当前搜索它时,所有字段都是可搜索的,并返回有效的结果,除非我使用数字值进行搜索。


侃侃无极
浏览 180回答 1
1回答

胡说叔叔

由于在数据类型上使用参数,然后使用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": []    }}
随时随地看视频慕课网APP

相关分类

Python
我要回答