zoukankan      html  css  js  c++  java
  • elasticsearch-搜索-match和match_phrase匹配原理(四)

    分词测试

    分词后倒排索引结果:可以通过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"
                }
                
            }
       }
    }

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

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

    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)

  • 相关阅读:
    jsoup
    【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌
    MD5 哈希等各种加密方式 都是对这个对象进行各种运算, 然后得出1个字符串
    【html】param 以及 embed 的有关 flash 属性详解
    【css】绝对定位的元素在 ie6 下不显示
    【javascript】浮点数运算问题分析及解决方法
    【jquery】邮箱自动补全 + 上下翻动
    【javascript】设为首页——setHome
    【javascript】js 检验密码强度
    【jquery】jquery 自定义滚动条
  • 原文地址:https://www.cnblogs.com/LQBlog/p/10580247.html
Copyright © 2011-2022 走看看