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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!