elasticsearch学习六、完全匹配搜索、精确匹配

2025-09-30 04:05:07

1、先看下NGram分词器属性

min_gram:单个词的最小长度,默认1

max_gram:但歌词的最大长度,默认2

token_chars:大概就是es会按照不在列表中的字符集合进行文本分割(具体意思大家看图原文^_^)

elasticsearch学习六、完全匹配搜索、精确匹配

2、token_chars 字符classes:

letter               for example a, b, ï or 京

digit                for example 3 or 7

whitespace     for example " " or "\n"

punctuation   for example ! or "

symbol           for example $ or √

elasticsearch学习六、完全匹配搜索、精确匹配

3、先看个example,

curl -XPUT 'localhost:9200/test' -d '

    {

        "settings" : {

            "analysis" : {

                "analyzer" : {

                    "my_ngram_analyzer" : {

                        "tokenizer" : "my_ngram_tokenizer"

                    }

                },

                "tokenizer" : {

                    "my_ngram_tokenizer" : {

                        "type" : "nGram",

                        "min_gram" : "2",

                        "max_gram" : "3",

                        "token_chars": [ "letter", "digit" ]

                    }

                }

            }

        }

    }'

elasticsearch学习六、完全匹配搜索、精确匹配

4、看下这个的分词效果

curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d '中华人民共和国'

elasticsearch学习六、完全匹配搜索、精确匹配

1、定义一个charsplit的分析器,使用的ngram分词。min_gram、max_gram为1,同时我只需要匹配letter、digit、punctuation。

curl -XPUT 'localhost:9200/dm_v1' -d '{

  "settings": {

    "analysis": {

      "analyzer": { 

        "charSplit": {

          "type": "custom",

           "tokenizer": "ngram_tokenizer"

        }

      },

     "tokenizer": {

           "ngram_tokenizer": {

             "type": "nGram",

             "min_gram": "1",

             "max_gram": "1",

             "token_chars": [

               "letter",

               "digit",

               "punctuation"

             ]

           }

        }

      }

   }

}'

elasticsearch学习六、完全匹配搜索、精确匹配

2、接下来创建mapping,可以参考我前面的学习四里面创建mapping,指定分析器为前面一步中定义的

elasticsearch学习六、完全匹配搜索、精确匹配

elasticsearch学习六、完全匹配搜索、精确匹配

3、接下来使用完全匹配查询试试啦.只出一条完全匹配的数据,搞定!

{

  "query": {

    "multi_match": {

      "query": "query_string",

      "type": "phrase",

      "slop": 0,        

      "fields": [

        "content"

      ],

      "analyzer": "charSplit", 

      "max_expansions": 1      

    }

  }

}

elasticsearch学习六、完全匹配搜索、精确匹配

4、最后记录一个组合的多条件查询

要求:查出样本1中,内容或者url或标题包含‘new’的所有记录。

需要注意的是fields中的属性include_in_all都是true的,这样_all才能对该字段搜索

{"query":{

    "bool":

    {"must":[{"term":{"sample":1}},{

    "multi_match": {

      "query": "new",

      "type": "phrase",

      "slop": 0,        

      "fields": [

        "content","url","bid_title"

      ],

      "analyzer": "charSplit", 

      "max_expansions": 1      

    }

  }]}

}

}

elasticsearch学习六、完全匹配搜索、精确匹配

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢