美文网首页
二十三、elasticSearch前缀搜索/通配符/ngram分

二十三、elasticSearch前缀搜索/通配符/ngram分

作者: 书写只为分享 | 来源:发表于2019-12-02 21:53 被阅读0次

    1、前缀搜索

    GET my_index/my_type/_search
    {
      "query": {
        "prefix": {
          "title": {
            "value": "C3"
          }
        }
      }
    }
    

    前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索,前缀搜索会进行全扫,就和数据库中的全表扫描,性能很差。
    2、通配符搜索

    GET my_index/my_type/_search
    {
      "query": {
        "wildcard": {
          "title": {
            "value": "C?K*5"
          }
        }
      }
    }
    

    ?:任意字符
    *:0个或任意多个字符

    性能一样差,必须扫描整个倒排索引,才ok
    3、正则搜索

    GET /my_index/my_type/_search 
    {
      "query": {
        "regexp": {
          "title": "C[0-9].+"
        }
      }
    }
    

    [0-9]:指定范围内的数字
    [a-z]:指定范围内的字母
    .:一个字符
    +:前面的正则表达式可以出现一次或多次

    4、搜索推荐

    GET /my_index/my_type/_search 
    {
      "query": {
        "match_phrase_prefix": {
          "title": "hello d"
        }
      }
    }
    

    原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索

    GET /my_index/my_type/_search 
    {
      "query": {
        "match_phrase_prefix": {
          "title":{
    “query”:"hello d",
    “slop”:10,
    “max_expansions”:50
    } 
        }
      }
    }
    

    hello就是去进行match,搜索对应的doc
    w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
    然后找到所有doc中,即包含hello,又包含w开头的字符的doc
    根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
    也可以指定slop,但是只有最后一个term会作为前缀
    max_expansions:指定prefix最多匹配多少个term,超过这个数量就不继续匹配了,限定性能
    5、什么是ngram/edge ngram
    就是分词切分设置
    例如:quick,5种长度下的ngram
    ngram length=1,q u i c k
    ngram length=2,qu ui ic ck
    ngram length=3,qui uic ick
    ngram length=4,quic uick
    ngram length=5,quick
    quick,anchor首字母后进行ngram
    q
    qu
    qui
    quic
    quick

    PUT /my_index
    {
      "settings": {
        "analysis": {
          "filter": {
            "autocomplete_filter":{
              "type":"ngram",
              "min_gram":1,
              "max_gram":20
            }
          },
          "analyzer": {
            "autocomplete":{
              "type":"custom",
              "tokenizer":"standard",
              "filter":[
                "lowercase","autocomplete_filter"
                ]
            }
          }
        }
      }
    }
    
    GET /my_index/_analyze
    {
      "analyzer": "autocomplete",
      "text": "zhuxingyu"
    }
    

    6、误拼写时的fuzzy模糊搜索技术

    GET /forum/article/_search
    {
      "query": {
        "fuzzy": {
          "title": {
            "value": "jddva",
            "fuzziness": 2
          }
        }
      }
    }
    

    fuzzy搜索以后,会自动尝试将你的搜索文本进行纠错,然后去跟文本进行匹配
    fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2
    另一种写法

    GET /forum/article/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "jdava BLOG",
            "fuzziness":"AUTO",
            "operator": "and"
          }
        }
      }
    }
    

    Operator:包含

    相关文章

      网友评论

          本文标题:二十三、elasticSearch前缀搜索/通配符/ngram分

          本文链接:https://www.haomeiwen.com/subject/aicqgctx.html