天天看點

es 中文分詞器前言一、使用中文分詞器建立索引二、使用步驟總結

中文分詞器

  • 前言
  • 一、使用中文分詞器建立索引
  • 二、使用步驟
    • 1.建立中文查詢
    • 2.問題原因
      • 2.1中文分詞器
    • 3. 解決方案
      • 3.1
  • 總結

前言

提示:es查詢中中文分詞器的使用是比較多的,

但是這個中文分詞器也有一些問題。

一、使用中文分詞器建立索引

PUT /test
{
  "settings" : {
    "analysis" : {
      "analyzer" : {
        "ik" : {
          "tokenizer" : "ik_max_word"
        }
      }
    }
  },
  "mappings": {
    "properties": {
        "name":    { "type": "text",
          "analyzer": "ik_max_word"
        },
        "nameType":     { "type": "text",
          "analyzer": "ik_max_word"},
        "time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis"
        },
      "tags": {
        "properties": {
          "id": {"type":"keyword"},
                  "tagName": {
                    "type": "text",
                    "analyzer": "ik_max_word"
                  }
        }
      }
      }
    }

}
           

插入記錄

es 中文分詞器前言一、使用中文分詞器建立索引二、使用步驟總結

二、使用步驟

1.建立中文查詢

//2、建立條件構造
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //3、構造條件
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(QueryBuilders.matchQuery("nameType","男"));
        BoolQueryBuilder condition = new BoolQueryBuilder();
        condition.should(QueryBuilders.matchQuery("name","明"));
        condition.should(QueryBuilders.matchQuery("tags.tagName","小"));

        boolQueryBuilder.must(condition);

        builder.query(boolQueryBuilder);
           

這裡查詢名字含有明字的查詢,

但是結果卻查不出來

es 中文分詞器前言一、使用中文分詞器建立索引二、使用步驟總結

2.問題原因

2.1中文分詞器

分詞器也不是所有的詞語都會分詞,可以用kibana對這個詞語進行分詞分析

es 中文分詞器前言一、使用中文分詞器建立索引二、使用步驟總結

這裡的王小明,隻會分詞成王小明,小明,是以查詢"明"字是查詢不出來的。

3. 解決方案

3.1

1.如果要求比對結果可以不是很準确,可以使用ik分詞器進行分詞。

2.如果要求,包含有的字一定要比對出來,使用text的類型即可,不使用ik分詞器,繼續使用matchquery,這樣查"明"是可以查出來的,缺點是每個字都會進行建立索引。

總結

提示:這裡對文章進行總結:

例如:以上就是今天要講的内容,如果同學們有更好的處理辦法,請留言,大家共同學習。