elasticsearch-搜索-match、match_phrase、wildcard匹配原理(四)

分词测试

分词后倒排索引结果:可以通过http://127.0.0.1:9200/_analyze 测试

{
    "analyzer":"ik_max_word",
    "text":"我爱广州小蛮腰"
}

 

match匹配

1.match会条件分词去索引里面找 命中一个满足就返回

插入2条测试数据

文档1: 我爱广州小小蛮腰

文档2: 我爱成都

索引 文档
[文档1,位置0-1][文档2,位置0-1]
[文档1,位置1-2][文档2,位置1-2]
广州 [文档1,位置2-3]
[文档1,位置3-4]
[文档1,位置4-5]
[文档1,位置5-6]
成都                       [文档2,位置2-3]

2.搜索:我爱

默认搜索条件会跟索引一样进行分词 搜索可以指定分词或者指定不分词

我爱分词为 [我:0-1] [爱:1-2]   2个索引都命中

根据索引可以找到文档1,2

3.搜索:我爱我家

分词为:[我:0-1][爱我:1-2][我家:2-3]  

[我:0-1] 命中3个文档 则返回三个文档

match_phrase

必须每个索引都命中同时 索引位置相邻才返回

1.搜索我爱命中文档 1 2

2.搜索我爱我家[我:0-1][爱我:1-2][我家:2-3]   虽然前面2个命中第三个没命中 则什么都搜索不出来

什么是索引位置相邻才返回?

比如搜索我爱成都,我们自己换了分词规则 搜索分词变为 [我:0-1][成都:1-2][爱:2-3] 虽然都能命中索引 但是索引位置不相邻 则不会命中

可以使用slop指定跨多少位置 比如以下就是允许跨1个位置  则可以查询出数据

复制代码
{
   "query":{
        "match_phrase":{
            "productName":{
                "query":"我爱我家",
                "slop":"1"
            }
            
        }
   }
}
复制代码

wildcard

支持模糊搜索

复制代码
{
    "from": 0,
    "size": 10,
    "query": {
        "bool": {
            "must": [
                {
                    "exists": {
                        "field": "rectifyNo",
                        "boost": 1.0
                    }
                },
                {
                    "term": {
                        "originFormNo": {
                            "value": "PF1816775320350027527",
                            "boost": 1.0
                        }
                    }
                },
                {
                    "term": {
                        "month": {
                            "value": "2024-12",
                            "boost": 1.0
                        }
                    }
                },
                {
                    "wildcard": {
                        "itemName": {
                            "wildcard": "*店面*",
                            "boost": 1.0
                        }
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1.0
        }
    },
    "sort": [
        {
            "rectifyCommitTime": {
                "order": "desc"
            }
        }
    ],
    "track_total_hits": 2147483647
}
复制代码

项目中遇到搜索不到数据的解决方式

如果出现搜索不出来数据 但是没有 按上面规则来进行判断

1.首先看搜索不出来的文档的分词规则

2.然后测试搜索分词跟他是否一致

使用以下api可以查询到指定文档指定字段的分词结果:

GET /${index}/${type}/${id}/_termvectors?fields=${fields_name}

使用以下api查看搜索结果

get http://127.0.0.1:9200/opcm3/_validate/query?explain

复制代码
{
    "query":{
        "match_phrase":{
            "productName":{
                "query":"纯生"
            }
        }
    }
}
复制代码
复制代码
{
    "valid": true,
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "explanations": [
        {
            "index": "opcm3",
            "valid": true,
            "explanation": "productName:\"(chun c) (sheng s)\""
        }
    ]
}
复制代码

可以理解为(chun or c) and (sheng or s)

 

 

 

posted @   意犹未尽  阅读(5801)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示