gpt4 book ai didi

elasticsearch - ElasticSearch-模糊且严格匹配多个字段

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

我们想利用ElasticSearch查找类似的对象。

可以说我有一个包含4个字段的对象:
产品名称,卖家名称,卖家电话,平台ID。

相似的产品在不同的平台上可以具有不同的产品名称和卖方名称(模糊匹配)。

虽然,电话是严格的,并且单个变化可能会导致产生错误的记录(严格匹配)。

试图创建的是一个查询,它将:

  • 考虑当前记录的所有字段,或者
    它们之间。
  • 任务platform_id是我要具体查看的对象。 (AND)
  • 模糊产品名称和卖方名称
  • 严格匹配电话号码,或在字段之间的OR中忽略它。

  • 如果我用伪代码编写它,我会写类似:

    ((product_name like 'some_product_name') OR (seller_name like 'some_seller_name') OR (seller_phone = 'some_phone')) AND (platform_id = 123)

    最佳答案

    为了对seller_phone进行精确匹配,我在没有ngram分析器的情况下对该字段进行了索引,并为product_nameseller_name加上了fuzzy_query

    映射

    PUT index111
    {
    "settings": {
    "analysis": {
    "analyzer": {
    "edge_n_gram_analyzer": {
    "tokenizer": "whitespace",
    "filter" : ["lowercase", "ednge_gram_filter"]
    }
    },
    "filter": {
    "ednge_gram_filter" : {
    "type" : "NGram",
    "min_gram" : 2,
    "max_gram": 10
    }
    }
    }
    },
    "mappings": {
    "document_type" : {
    "properties": {
    "product_name" : {
    "type": "text",
    "analyzer": "edge_n_gram_analyzer"
    },
    "seller_name" : {
    "type": "text",
    "analyzer": "edge_n_gram_analyzer"
    },
    "seller_phone" : {
    "type": "text"
    },
    "platform_id" : {
    "type": "text"
    }
    }
    }
    }
    }

    索引文件
    POST index111/document_type
    {
    "product_name":"macbok",
    "seller_name":"apple",
    "seller_phone":"9988",
    "platform_id":"123"
    }

    对于以下伪SQL查询
    ((product_name like 'some_product_name') OR (seller_name like 'some_seller_name') OR (seller_phone = 'some_phone')) AND (platform_id = 123)

    flex 查询
    POST index111/_search
    {
    "query": {
    "bool": {
    "must": [
    {
    "term": {
    "platform_id": {
    "value": "123"
    }
    }
    },
    {
    "bool": {
    "should": [{
    "fuzzy": {
    "product_name": {
    "value": "macbouk",
    "boost": 1.0,
    "fuzziness": 2,
    "prefix_length": 0,
    "max_expansions": 100
    }
    }
    },
    {
    "fuzzy": {
    "seller_name": {
    "value": "apdle",
    "boost": 1.0,
    "fuzziness": 2,
    "prefix_length": 0,
    "max_expansions": 100
    }
    }
    },
    {
    "term": {
    "seller_phone": {
    "value": "9988"
    }
    }
    }
    ]
    }
    }]
    }
    }
    }

    希望这可以帮助

    关于elasticsearch - ElasticSearch-模糊且严格匹配多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44517875/

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