国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

這篇具有很好參考價(jià)值的文章主要介紹了ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

01. ElasticSearch 分析器

1. ElasticSearch match 文本搜索的過程?

Elasticsearch 的 match 查詢是一種基于文本匹配的查詢方式,它的搜索過程如下:

① 將查詢字符串分詞:Elasticsearch 會(huì)將查詢字符串分成一個(gè)個(gè)詞項(xiàng)(term),并去除停用詞(如“的”、“是”等常用詞匯)和標(biāo)點(diǎn)符號(hào)等無意義的字符。

② 構(gòu)建倒排索引:Elasticsearch 會(huì)將每個(gè)詞項(xiàng)與它所在的文檔建立倒排索引(inverted index),即記錄每個(gè)詞項(xiàng)出現(xiàn)的文檔編號(hào)和出現(xiàn)次數(shù)。

③ 計(jì)算文檔得分:當(dāng)執(zhí)行 match 查詢時(shí),Elasticsearch 會(huì)根據(jù)查詢字符串中的詞項(xiàng)在倒排索引中查找對(duì)應(yīng)的文檔,并計(jì)算每個(gè)文檔的得分。得分的計(jì)算方式包括詞頻(term frequency)、逆文檔頻率(inverse document frequency)和字段長度等因素。

④ 返回結(jié)果:Elasticsearch 會(huì)按照得分從高到低的順序返回匹配的文檔,同時(shí)可以根據(jù)需要進(jìn)行分頁、排序、過濾等操作。

總的來說,Elasticsearch 的 match 查詢是一種基于倒排索引的文本匹配方式,它可以高效地處理大規(guī)模的文本數(shù)據(jù),并返回與查詢字符串相關(guān)的文檔。

如下為文本搜索的過程:

ES 分析器先將查詢詞切分為“金都”和“怡家”,然后分別到倒排索引里查找兩個(gè)詞對(duì)應(yīng)的文檔列表并獲得了文檔1、2、3,然后根據(jù)相關(guān)性算法計(jì)算文檔得分并進(jìn)行排序,最后將文檔集合返回給客戶端。

2. ElasticSearch 分析器是什么?

ElasticSearch 是一個(gè)基于 Lucene 的分布式搜索引擎,它提供了豐富的分析器來處理文本數(shù)據(jù)。分析器是將文本數(shù)據(jù)轉(zhuǎn)換為可索引的單詞的過程,一般用在下面兩個(gè)場景中:

① 創(chuàng)建或更新文檔時(shí),對(duì)相應(yīng)的文本字段進(jìn)行分詞處理;

② 查詢文本字段時(shí),對(duì)查詢語句進(jìn)行分詞。

ES中的分析器有很多種,但是所有分析器的結(jié)構(gòu)都遵循三段式原則,即字符過濾器、分詞器和詞語過濾器。其中,字符過濾器可以有0個(gè)或多個(gè),分詞器必須只有一個(gè),詞語過濾器可以有0個(gè)或多個(gè)。從整體上來講,三個(gè)部分的數(shù)據(jù)流方向?yàn)樽址^濾器→分詞器→分詞過濾器。

① 字符過濾器:用于對(duì)原始文本進(jìn)行預(yù)處理,例如去除 HTML 標(biāo)簽、轉(zhuǎn)換大小寫等。

② 分詞器:將文本數(shù)據(jù)分割成單詞,例如將一段中文文本分割成單個(gè)漢字或者按照空格、標(biāo)點(diǎn)符號(hào)等進(jìn)行分割。

③ 詞語過濾器:對(duì)分詞器產(chǎn)生的單詞進(jìn)行進(jìn)一步處理,例如去除停用詞、同義詞轉(zhuǎn)換、詞干提取等。

ElasticSearch 提供了多種內(nèi)置的分析器,例如 Standard Analyzer、Simple Analyzer、Whitespace Analyzer、Keyword Analyzer 等。此外,ElasticSearch 還支持自定義分析器,用戶可以根據(jù)自己的需求定義自己的分析器。

3. ElasticSearch 分析器的功能?

Elasticsearch 分析器是用于將文本數(shù)據(jù)分解為單個(gè)詞匯單元的組件。它們是搜索引擎中的重要組成部分,因?yàn)樗鼈冊试S搜索引擎在索引和搜索文本數(shù)據(jù)時(shí)進(jìn)行正確的匹配。以下是 ElasticSearch 分析器的一些常見功能:

① 分詞:將文本數(shù)據(jù)分解為單個(gè)詞匯單元,例如將句子分解為單個(gè)單詞。

② 去除停用詞:去除常見的無意義詞匯,例如“a”、“an”、“the”等。

③ 小寫化:將所有文本轉(zhuǎn)換為小寫,以便在搜索時(shí)不區(qū)分大小寫。

④ 同義詞擴(kuò)展:將搜索詞擴(kuò)展為其同義詞,以便在搜索時(shí)能夠匹配更多的文本數(shù)據(jù)。

⑤ 詞干提取:將單詞轉(zhuǎn)換為其基本形式,例如將“running”轉(zhuǎn)換為“run”。

⑥ 字符過濾:去除文本中的特定字符,例如標(biāo)點(diǎn)符號(hào)或 HTML 標(biāo)簽。

⑦ 自定義規(guī)則:允許用戶定義自己的規(guī)則,以便在分析器中執(zhí)行特定的操作。

這些功能可以根據(jù)需要進(jìn)行組合和配置,以便在搜索引擎中實(shí)現(xiàn)最佳的文本匹配和搜索結(jié)果。

02. ElasticSearch 字符過濾器

4. ElasticSearch 字符過濾器是什么?

Elasticsearch 字符過濾器是一種用于處理文本的插件,它可以在文本被分詞之前對(duì)其進(jìn)行預(yù)處理。字符過濾器可以用于去除 HTML 標(biāo)簽、轉(zhuǎn)換字符大小寫、刪除特定字符或字符序列、替換字符等操作。在處理文本之前,字符過濾器可以對(duì)文本進(jìn)行清理和標(biāo)準(zhǔn)化,以便更好地進(jìn)行搜索和分析。Elasticsearch 提供了許多內(nèi)置的字符過濾器,同時(shí)也支持自定義字符過濾器。

5. ElasticSearch 內(nèi)置的字符過濾器有哪些?

ElasticSearch 內(nèi)置了許多字符過濾器,可以用于在索引和搜索期間對(duì)文本進(jìn)行預(yù)處理。以下是一些常見的字符過濾器:

① html_strip:從文本中刪除 HTML 標(biāo)記。
② pattern_replace:使用正則表達(dá)式替換文本中的模式。
③ lowercase:將文本轉(zhuǎn)換為小寫。
④ uppercase:將文本轉(zhuǎn)換為大寫。
⑤ ascii_folding:將文本中的非 ASCII 字符轉(zhuǎn)換為 ASCII 字符。
⑥ mapping:使用映射表替換文本中的字符。
⑦ trim:刪除文本開頭和結(jié)尾的空格。
⑧ length:刪除文本中長度小于或大于指定值的單詞。

6. ElasticSearch 字符過濾器如何使用?

① 自定義一個(gè)字符過濾器

② 自定義一個(gè)分析器,并使用自定義字符過濾器

③ 對(duì)索引的字段使用自定義分析器

PUT /my_index
{
  "settings": {
    "analysis": {
      // 自定義一個(gè)過濾器:用于將文本中的“&”字符替換為“and”  
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": ["& => and"]
        }
      }, 
      // 自定義一個(gè)分析器:在分析器中使用字符過濾器
      "analyzer": {
         "my_analyzer": {
           // 使用 "standard" 分詞器將文本分成單詞
          "tokenizer": "standard",
           // 使用 "my_char_filter" 字符過濾器對(duì)文本進(jìn)行預(yù)處理 
          "char_filter": ["my_char_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      // 對(duì) my_field 字段使用 my_analyzer 分析器
      "my_field": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

④ 索引文本,索引一個(gè)包含“AT&T”文本的文檔:

PUT /my_index/_doc/1
{
  "my_field": "AT & T"
}

⑤ 搜索包含“AT and T”文本的文檔:

GET /my_index/_search
{
  "query": {
    "match": {
      "my_field": "AT and T"
    }
  }
}
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "my_field" : "AT & T"
        }
      }
    ]
  }
}

03. ElasticSearch 分詞器

7. ElasticSearch 分詞器是什么?

Elasticsearch 分詞器是用于將文本分解為單詞(或詞條)。在 Elasticsearch 中,文本被視為一個(gè)或多個(gè)單詞的集合,這些單詞被稱為詞條。分詞器將文本分解為詞條,并將這些詞條存儲(chǔ)在倒排索引中,以便能夠快速地搜索和檢索文檔。

8. ElasticSearch 內(nèi)置的分詞器有哪些?

ElasticSearch 內(nèi)置的分詞器包括:

① Standard Analyzer:標(biāo)準(zhǔn)分析器,適用于大多數(shù)語言,按照空格和標(biāo)點(diǎn)符號(hào)進(jìn)行分詞。

② Simple Analyzer:簡單分析器,按照非字母字符進(jìn)行分詞。

③ Whitespace Analyzer:空格分析器,按照空格進(jìn)行分詞。

④ Stop Analyzer:停用詞分析器,去除常見的停用詞,如“的”、“是”、“在”等。

⑤ Keyword Analyzer:關(guān)鍵詞分析器,不進(jìn)行分詞,直接將輸入作為一個(gè)整體進(jìn)行索引。

⑥ Pattern Analyzer:模式分析器,按照正則表達(dá)式進(jìn)行分詞。

⑦ Language Analyzers:語言分析器,針對(duì)不同的語言提供了特定的分析器,如中文分析器、日文分析器等。

除了以上內(nèi)置的分詞器,ElasticSearch 還支持自定義分詞器,可以根據(jù)具體需求進(jìn)行定制。

9. ElasticSearch 分詞器如何使用?

ElasticSearch 分詞器是用于將文本分解為單詞或詞匯單元的工具。在 ElasticSearch 中,分詞器是用于索引和搜索文本的關(guān)鍵組件之一。以下是使用 ElasticSearch 分詞器的一些步驟:

① 創(chuàng)建索引:在 ElasticSearch 中,首先需要?jiǎng)?chuàng)建一個(gè)索引,以便可以將文檔添加到其中。

② 定義分詞器:在創(chuàng)建索引時(shí),需要定義一個(gè)分詞器。ElasticSearch 提供了多種不同類型的分詞器,例如標(biāo)準(zhǔn)分詞器、簡單分詞器、語言分詞器等。 如下,創(chuàng)建了一個(gè)名為 my_index 的索引,并定義了一個(gè)名為 my_analyzer 的分詞器。然后,我們將 my_field 字段定義為 text 類型,并將其分析器設(shè)置為 my_analyzer。

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer":{
          "type": "standard"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_field":{
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

③ 添加文檔:在索引中添加文檔時(shí),ElasticSearch 將使用指定的分詞器將文本分解為單詞或詞匯單元,并將其存儲(chǔ)在索引中。

POST /my_index/_doc/1
{
  "my_field": "這是一個(gè)示例文本"
}

④ 搜索文檔:當(dāng)搜索文檔時(shí),ElasticSearch 將使用相同的分詞器將搜索查詢分解為單詞或詞匯單元,并在索引中查找匹配的文檔。

GET /my_index/_search
{
  "query": {
    "match": {
      "my_field": "示例"
    }
  }
}
{
  "took" : 376,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "my_field" : "這是一個(gè)示例文本"
        }
      }
    ]
  }
}

04. ElasticSearch 分詞過濾器

10. ElasticSearch 分詞過濾器是什么?

分詞過濾器接收分詞器的處理結(jié)果,并可以將切分好的詞語進(jìn)行加工和修改,進(jìn)而對(duì)分詞結(jié)果進(jìn)行規(guī)范化、統(tǒng)一化和優(yōu)化處理。例如,它可以將文本中的字母全部轉(zhuǎn)換為小寫形式,還可以刪除停用詞(如的、這、那等),還可以為某個(gè)分詞增加同義詞。ElasticSearch 提供了許多內(nèi)置的分詞過濾器,同時(shí)也支持自定義分詞過濾器。

11. ElasticSearch 內(nèi)置的分詞過濾器有哪些?

Elasticsearch 內(nèi)置的分詞過濾器有很多,以下是一些常用的分詞過濾器:

① Lowercase Token Filter:將所有的單詞轉(zhuǎn)換為小寫形式。
② Stop Token Filter:去除常見的停用詞,如“a”、“an”、“the”等。
③ Stemmer Token Filter:將單詞還原為其詞干形式,如“running”還原為“run”。
④ Synonym Token Filter:將指定的同義詞替換為原始詞匯,如“car”和“automobile”。
⑤ Word Delimiter Token Filter:將單詞拆分為子單詞,如“WiFi”拆分為“Wi”和“Fi”。
⑥ Edge N-gram Token Filter:生成指定長度的前綴或后綴 n-gram,如“quick”生成“q”、“qu”、“qui”、“quic”、“quick”。
⑦ Length Token Filter:過濾掉長度不在指定范圍內(nèi)的單詞。

以上僅是一些常用的分詞過濾器,Elasticsearch 還提供了很多其他的分詞過濾器,可以根據(jù)具體需求進(jìn)行選擇和配置。

12. ElasticSearch 分詞過濾器如何使用?

ElasticSearch 分詞過濾器是用于對(duì)文本進(jìn)行分詞和過濾的工具。它可以將文本分解成單詞,并根據(jù)指定的規(guī)則進(jìn)行過濾和轉(zhuǎn)換。以下是 ElasticSearch 分詞過濾器的使用方法:

① 在創(chuàng)建索引時(shí)指定分詞器和過濾器:創(chuàng)建一個(gè)名為 my_index 的索引,并指定了一個(gè)名為 my_analyzer 的標(biāo)準(zhǔn)分詞器,并使用了一個(gè)名為 _english_ 的停用詞過濾器。我們還將 my_field 字段的分析器設(shè)置為 my_analyzer。

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

② 索引文檔:

PUT /my_index/_doc/1
{
  "my_field":"這是一個(gè)文本示例"
}

③ 使用分詞器和過濾器進(jìn)行搜索:

GET /my_index/_search
{
  "query": {
    "match": {
      "my_field":{
        "query":  "文本示例",
        "analyzer": "my_analyzer"
      }
    }
  }
}
{
  "took" : 545,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.72928625,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.72928625,
        "_source" : {
          "my_field" : "這是一個(gè)文本示例"
        }
      }
    ]
  }
}

05. ElasticSearch 分析器的使用

13. ElasticSearch 分析器 API 的使用

① DSL中可以直接使用參數(shù)analyzer來指定分析器的名稱進(jìn)行測試,分析API的請(qǐng)求形式如下:

POST /_analyze 
{ 
  "analyzer": "standard",     //指定分析器名稱為standard 
  "text": "The letter tokenizer is not configurable."  //待分析文本 
}  

standard分析器對(duì)文本進(jìn)行分析時(shí),按照空格把上面的句子進(jìn)行了分詞。分析API返回信息的參數(shù)說明如下:

  • token:文本被切分為詞語后的某個(gè)詞語;
  • start_offset:該詞在文本中的起始偏移位置;
  • end_offset:該詞在文本中的結(jié)束偏移位置;
  • type:詞性,各個(gè)分詞器的值不一樣;
  • position:分詞位置,指明該詞語在原文本中是第幾個(gè)出現(xiàn)的。
  • start_offset和end_offset組合起來就是該詞在原文本中占據(jù)的起始位置和結(jié)束位置。
{ 
 "tokens" : [                   //分析器將文本切分后的分析結(jié)果 
    { 
      "token" : "the",          //將文本切分后的第一個(gè)詞語 
      "start_offset" : 0,       //該詞在文本中的起始偏移位置 
      "end_offset" : 3,         //該詞在文本中的結(jié)束偏移位置 
      "type" : "<ALPHANUM>",    //詞性 
      "position" : 0            //該詞語在原文本中是第0個(gè)出現(xiàn)的詞語 
    }, 
    { 
      "token" : "letter", 
      "start_offset" : 4, 
      "end_offset" : 10, 
      "type" : "<ALPHANUM>", 
      "position" : 1 
    }, 
    {
      "token" : "tokenizer",
      "start_offset" : 11,
      "end_offset" : 20,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "is",
      "start_offset" : 21,
      "end_offset" : 23,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "not",
      "start_offset" : 24,
      "end_offset" : 27,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "configurable",
      "start_offset" : 28,
      "end_offset" : 40,
      "type" : "<ALPHANUM>",
      "position" : 5
    }
  ]
}

② 除了指定分析器進(jìn)行請(qǐng)求分析外,用戶還可以指定某個(gè)索引的字段,使用這個(gè)字段對(duì)應(yīng)的分析器對(duì)目標(biāo)文本進(jìn)行分析。下面使用酒店索引的title字段對(duì)應(yīng)的分析器分析文本。

POST /hotel/_analyze 
{                               //使用酒店索引的title字段對(duì)應(yīng)的分析器分析文本 
  "field": "title", 
  "text": "金都嘉怡假日酒店" 
}

③ 在下面的示例中自定義了一個(gè)分析器,該分析器的分詞器使用standard,分詞過濾器使用Lower Case,其將分詞后的結(jié)果轉(zhuǎn)換為小寫形式。

GET _analyze 
{ 
  "tokenizer": "standard",                   //使用standard分詞器 
  "filter":["lowercase"],                    //使用Lower Case分詞過濾器 
  "text": "JinDu JiaYi Holiday Hotel"       //待分析文本 
}
{
  "tokens" : [
    {
      "token" : "jindu",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "jiayi",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "holiday",
      "start_offset" : 12,
      "end_offset" : 19,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "hotel",
      "start_offset" : 20,
      "end_offset" : 25,
      "type" : "<ALPHANUM>",
      "position" : 3
    }
  ]
}

14. ElasticSearch 內(nèi)置分析器

ES已經(jīng)內(nèi)置了一些分析器供用戶使用,在默認(rèn)情況下,一個(gè)索引的字段類型為text時(shí),該字段在索引建立時(shí)和查詢時(shí)的分析器是standard。standard分析器是由standard分詞器、Lower Case分詞過濾器和Stop Token分詞過濾器構(gòu)成的。注意,standard分析器沒有字符過濾器。 ElasticSearch 內(nèi)置了許多分析器,可以用于處理文本數(shù)據(jù)。以下是一些常見的 ElasticSearch 內(nèi)置分析器:

① Standard Analyzer:標(biāo)準(zhǔn)分析器是默認(rèn)的分析器,它將文本分成單個(gè)單詞,并刪除停用詞和標(biāo)點(diǎn)符號(hào)。

② Simple Analyzer:簡單分析器將文本分成單個(gè)單詞,但不刪除停用詞和標(biāo)點(diǎn)符號(hào)。

③ Whitespace Analyzer:空格分析器將文本分成單個(gè)單詞,但不刪除任何字符。

④ Keyword Analyzer:關(guān)鍵字分析器將整個(gè)文本作為單個(gè)單詞處理,不進(jìn)行任何分詞或標(biāo)記化。

⑤ Stop Analyzer:停用詞分析器刪除常見的停用詞,例如“a”和“the”。

⑥ Pattern Analyzer:模式分析器使用正則表達(dá)式將文本分成單個(gè)單詞。

⑦ Language Analyzers:ElasticSearch 還提供了多種語言分析器,例如英語、法語、德語、西班牙語等,這些分析器可以處理特定語言的文本數(shù)據(jù)。

以上是一些常見的 ElasticSearch 內(nèi)置分析器,可以根據(jù)需要選擇適合的分析器來處理文本數(shù)據(jù)。

15. ElasticSearch 索引時(shí)使用分析器

文本字段在索引時(shí)需要使用分析器進(jìn)行分析,ES默認(rèn)使用的是standard分析器。如果需要指定分析器,一種方式是在索引的settings參數(shù)中設(shè)置當(dāng)前索引的所有文本字段的分析器,另一種方式是在索引的mappings參數(shù)中設(shè)置當(dāng)前字段的分析器。

① 在settings參數(shù)中指定在酒店索引的所有文本字段中使用simple分析器進(jìn)行索引構(gòu)建。

PUT /hotel
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type": "simple" 
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "content":{
        "type": "text"
      }
    }
  }
}

② 在mappings參數(shù)中指定在酒店索引的 title 字段中使用 whitespace 分析器進(jìn)行索引構(gòu)建:

PUT /hotel 
{ 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "whitespace"  
      }, 
      "content":{
        "type": "text"
      }
    } 
  } 
} 

16. ElasticSearch 搜索時(shí)使用分析器

為了搜索時(shí)更加協(xié)調(diào),在默認(rèn)情況下,ES對(duì)文本進(jìn)行搜索時(shí)使用的分析器和索引時(shí)使用的分析器保持一致。當(dāng)然,用戶也可以在mappings參數(shù)中指定字段在搜索時(shí)使用的分析器。

PUT /hotel 
{ 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "whitespace",            //索引時(shí)使用whitespace分析器 
        "search_analyzer": "whitespace"      //搜索時(shí)使用whitespace分析器 
      }, 
    } 
  } 
}  

注意,這里指定的搜索分析器和索引時(shí)的分析器是一致的,但是在大多數(shù)情況下是沒有必要指定的,因?yàn)樵谀J(rèn)情況下二者就是一致的。如果指定的搜索分析器和索引時(shí)的分析器不一致,則ES在搜索時(shí)可能出現(xiàn)有不符合預(yù)期的匹配情況,因此該設(shè)置在使用時(shí)需要慎重選擇。

17. ElasticSearch 自定義分詞器

當(dāng)系統(tǒng)內(nèi)置的分析器不滿足需求時(shí),用戶可以使用自定義分析器。在有些場景中,某個(gè)文本字段不是自然語言而是在某種規(guī)則下的編碼。

① 創(chuàng)建索引時(shí)使用自定義分詞器

在settings部分中,定義了一個(gè)名為“comma_analyzer”的分析器,它使用名為“comma_tokenizer”的分詞器。該分詞器使用逗號(hào)作為分隔符,將文本分成多個(gè)詞條。這個(gè)分析器可以用于分析“title”字段中的文本。

在mappings部分中,title屬性是一個(gè)文本類型,但使用了之前定義的“comma_analyzer”分析器進(jìn)行分析。這意味著文本將按照逗號(hào)進(jìn)行分詞

PUT /hotel 
{ 
  "settings": { 
    "analysis": { 
      "analyzer": { 
        "comma_analyzer": {                    
          "tokenizer": "comma_tokenizer"      
        } 
      }, 
      "tokenizer": {          
        "comma_tokenizer": { 
          "type": "pattern", 
          "pattern": ","      
        } 
      } 
    } 
  }, 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "comma_analyzer"      
      }
    } 
  } 
}

② 下面向酒店索引中插入幾條數(shù)據(jù):

POST /_bulk 
{"index":{"_index":"hotel","_id":"001"}} 
{"title":"APP,H5"} 
{"index":{"_index":"hotel","_id":"002"}} 
{"title":"H5,WX"} 
{"index":{"_index":"hotel","_id":"003"}} 
{"title":"WX"}

③ 當(dāng)前用戶的客戶端為H5或App,當(dāng)搜索“金都”關(guān)鍵詞時(shí)應(yīng)該構(gòu)建的DSL如下:

GET /hotel/_search 
{ 
  "query": {
    "match": {
      "title": "APP,H5"
    }
  } 
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.3411059,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "001",
        "_score" : 1.3411059,
        "_source" : {
          "title" : "APP,H5"
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 0.43445712,
        "_source" : {
          "title" : "H5,WX"
        }
      }
    ]
  }
}

06. ElasticSearch 中文分詞器

比較常用的第三方中文分析器是HanLP和IK分析器。

18. ElasticSearch ik分析器

Elasticsearch Ik分詞器是一種基于Java開發(fā)的中文分詞器,它是Elasticsearch官方推薦的中文分詞器之一。Ik分詞器支持細(xì)粒度和智能分詞兩種分詞模式,可以根據(jù)不同的需求進(jìn)行選擇。細(xì)粒度模式適用于搜索引擎等需要精確匹配的場景,而智能模式則適用于一般的文本分析場景。

Ik分詞器還支持自定義詞典,可以通過添加自定義詞典來提高分詞的準(zhǔn)確性。同時(shí),Ik分詞器還支持多種分詞器插件,如拼音分詞器、同義詞分詞器等,可以根據(jù)具體需求進(jìn)行選擇和配置。

總的來說,Elasticsearch Ik分詞器是一種功能強(qiáng)大、靈活性高的中文分詞器,可以滿足各種中文文本分析的需求。

19. ElasticSearch 分析器 ik_smart 和 ik_max_word

IK分析器提供了兩個(gè)子分析器,即 ik_smart 和 ik_max_word,另外它還提供了兩個(gè)和分析器同名的子分詞器。

下例使用ik_max_word分析器對(duì)待測試文本進(jìn)行分析:

POST _analyze 
{ 
  "analyzer": "ik_max_word",           
  "text": "金都嘉怡假日酒店" 
}  
{
  "tokens" : [
    {
      "token" : "金都",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "嘉",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "怡",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "假日酒店",
      "start_offset" : 4,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "假日",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "酒店",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 5
    }
  ]
}

下例使用ik_smart分析器對(duì)待測試文本進(jìn)行分析:

POST _analyze 
{ 
  "analyzer": "ik_smart",       
  "text": "金都嘉怡假日酒店" 
} 
{
  "tokens" : [
    {
      "token" : "金都",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "嘉",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "怡",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "假日酒店",
      "start_offset" : 4,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}

從上述兩個(gè)分析結(jié)果中可以看到,ik_max_word和ik_smart分析器的主要區(qū)別在于切分詞語的粒度上,ik_smart的切分粒度比較粗,而ik_max_word將文本進(jìn)行了最細(xì)粒度的拆分,甚至窮盡了各種可能的組合。

20. ElasticSearch ik分析器如何使用

① 創(chuàng)建索引時(shí)指定使用IK分詞器:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ik_analyzer": {
          "tokenizer": "ik_max_word"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "ik_analyzer"
      }
    }
  }
}

② 索引文檔:

PUT /my_index/_doc/1
{
  "content":"中國人民"
}

PUT /my_index/_doc/2
{
  "content":"中國銀行"
}

③ 查詢時(shí)使用IK分詞器:

GET /my_index/_search
{
  "query": {
    "match": {
      "content": {
        "query": "中國人民銀行",
        "analyzer": "ik_max_word"
      }
    }
  }
}
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.6807432,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 2.6807432,
        "_source" : {
          "content" : "中國人民"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.9752057,
        "_source" : {
          "content" : "中國銀行"
        }
      }
    ]
  }
}

07. ElasticSearch 使用同義詞

在搜索場景中,同義詞用來處理不同的查詢詞,有可能是表達(dá)相同搜索目標(biāo)的場景。例如,當(dāng)用戶的查詢詞為“帶浴缸的酒店”和“帶浴池的酒店”時(shí),其實(shí)是想搜索有單獨(dú)泡澡設(shè)施的酒店。再例如,在電商搜索中,同義詞更是應(yīng)用廣泛,如品牌同義詞Adidas和“阿迪達(dá)斯”,產(chǎn)品同義詞“投影儀”和“投影機(jī)”,修飾同義詞“大碼”和“大號(hào)”等。用戶在使用這些與同義詞相關(guān)的關(guān)鍵詞進(jìn)行搜索時(shí),搜索引擎返回的搜索結(jié)果應(yīng)該是一致的。

用戶還可以通過ES中的分析器來使用同義詞,使用方式分為兩種,一種是在建立索引時(shí)指定同義詞并構(gòu)建同義詞的倒排索引,另一種是在搜索時(shí)指定字段的search_analyzer查詢分析器使用同義詞。

21. ElasticSearch 建立索引時(shí)使用同義詞

在ES內(nèi)置的分詞過濾器中,有一種分詞過濾器叫作synonyms,它是一種支持用戶自定義同義詞的分詞過濾器。

① 建立索引時(shí)使用同義詞分析器:

"settings"字段:該字段用于設(shè)置索引的分析器,其中包含了一個(gè)名為"ik_synonyms_filter"的同義詞過濾器,用于將一些同義詞進(jìn)行轉(zhuǎn)換。例如,"北京"和"首都"是同義詞,"天津"和"天津衛(wèi)"是同義詞,"假日"和"度假"是同義詞。

“mappings"字段:該字段用于定義索引中的文檔類型及其屬性。在這個(gè)例子中,只定義了一個(gè)"title"屬性,它的類型是"text”,使用了名為"ik_analyzer_synonyms"的分析器。這個(gè)分析器使用了"ik_max_word"分詞器,將文本進(jìn)行分詞,并使用"lowercase"過濾器將所有單詞轉(zhuǎn)換為小寫字母,然后使用"ik_synonyms_filter"過濾器將同義詞進(jìn)行轉(zhuǎn)換。

PUT /hotel 
{ 
  "settings": { 
    "analysis": { 
     "filter": {                       //定義分詞過濾器 
        "ik_synonyms_filter": {  
          "type": "synonym", 
          "synonyms": [                //在分詞過濾器中定義近義詞 
            "北京,首都", 
            "天津,天津衛(wèi)", 
            "假日,度假" 
          ] 
        } 
      }, 
     "analyzer": {                      //自定義分析器 
        "ik_analyzer_synonyms": { 
          "tokenizer": "ik_max_word",   //指定分詞器 
          "filter": [                   //指定分詞過濾器 
            "lowercase", 
            "ik_synonyms_filter" 
          ] 
        } 
      } 
       
    } 
  }, 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "ik_analyzer_synonyms"  //指定索引時(shí)使用自定義的分析器 
      }
    } 
  } 
}

② 索引文檔:

POST /_bulk 
{"index":{"_index":"hotel","_id":"001"}} 
{"title": "文雅假日酒店"} 
{"index":{"_index":"hotel","_id":"002"}} 
{"title": "北京金都嘉酒店"} 
{"index":{"_index":"hotel","_id":"003"}} 
{"title": "天津金都欣欣酒店"} 
{"index":{"_index":"hotel","_id":"004"}} 
{"title": "金都酒店"} 
{"index":{"_index":"hotel","_id":"005"}} 
{"title": "文雅精選酒店"}  

③ 搜索文檔:

GET /hotel/_search 
{ 
 "query": {                          
    "match": { 
      "title": "首都度假" 
    } 
  } 
}  
{
  "took" : 415,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.9320302,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "001",
        "_score" : 1.9320302,
        "_source" : {
          "title" : "文雅假日酒店"
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 1.9320302,
        "_source" : {
          "title" : "北京金都嘉酒店"
        }
      }
    ]
  }
}

由上面的結(jié)果可見,酒店標(biāo)題中的“北京”和“假日”分別可以匹配查詢詞中的“首都”和“度假”,說明前面的同義詞設(shè)置成功。

22. ElasticSearch 查詢時(shí)使用同義詞

在ES內(nèi)置的分詞過濾器中還有個(gè)分詞過濾器叫作synonym_graph,它是一種支持查詢時(shí)用戶自定義同義詞的分詞過濾器。

① 建立索引時(shí)使用同義詞分析器:

PUT /hotel 
{ 
  "settings": { 
    "analysis": { 
     "filter": {                          //定義分詞過濾器 
        "ik_synonyms_graph_filter": { 
          "type": "synonym_graph", 
          "synonyms": [                   //在分詞過濾器中定義近義詞 
            "北京,首都", 
            "天津,天津衛(wèi)", 
            "假日,度假" 
          ] 
        } 
      }, 
      "analyzer": {                       //自定義分析器 
        "ik_analyzer_synonyms_graph": { 
          "tokenizer": "ik_max_word",     //指定分詞器 
          "filter": [      				  //指定分詞過濾器 
            "lowercase", 
            "ik_synonyms_graph_filter" 
          ] 
        } 
      } 
       
    } 
  }, 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "ik_max_word", 
        "search_analyzer": "ik_analyzer_synonyms_graph"  //指定查詢時(shí)使用自定義的分析器 
      }
    } 
  } 
}  

② 索引文檔:

POST /_bulk 
{"index":{"_index":"hotel","_id":"001"}} 
{"title": "文雅假日酒店"} 
{"index":{"_index":"hotel","_id":"002"}} 
{"title": "北京金都嘉酒店"} 
{"index":{"_index":"hotel","_id":"003"}} 
{"title": "天津金都欣欣酒店"} 
{"index":{"_index":"hotel","_id":"004"}} 
{"title": "金都酒店"} 
{"index":{"_index":"hotel","_id":"005"}} 
{"title": "文雅精選酒店"}  

③ 檢索文檔:

GET /hotel/_search 
{ 
 "query": {                          
    "match": { 
      "title": "首都度假" 
    } 
  } 
} 
{
  "took" : 29,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.2929529,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "001",
        "_score" : 1.2929529,
        "_source" : {
          "title" : "文雅假日酒店"
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "002",
        "_score" : 1.2929529,
        "_source" : {
          "title" : "北京金都嘉酒店"
        }
      }
    ]
  }
}

08. ElasticSearch 使用停用詞

23. ElasticSearch 自定義分析器使用停用詞

Elasticsearch 支持使用停用詞來提高搜索的準(zhǔn)確性和效率。停用詞是指在搜索中被忽略的常見詞語,例如“的”、“是”、“在”等。這些詞語在搜索中出現(xiàn)的頻率很高,但它們并沒有提供有用的信息,因此可以被忽略。

在 Elasticsearch 中,可以使用停用詞過濾器來過濾掉停用詞。停用詞過濾器可以在索引和搜索時(shí)使用。在索引時(shí),可以在分析器中配置停用詞過濾器,以便在索引文檔時(shí)過濾掉停用詞。在搜索時(shí),可以在查詢中使用停用詞過濾器,以便在搜索時(shí)過濾掉停用詞。

① 可以通過創(chuàng)建自定義分析器的方式使用停用詞,方法是在分析器中指定停用詞過濾器,在過濾器中可以指定若干個(gè)停用詞。下面使用standard分詞器和停用詞過濾器組成一個(gè)自定義分析器進(jìn)行索引定義DSL如下:

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_top_filter":{
          "type":"stop",
          "stopwords":["我","的","這"]
        }
      },
      "analyzer": {
        "standard_stop":{
          "tokenizer": "standard", 
          "filter":["my_top_filter"] 
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "standard_stop"
      }
    }
  }
}

② 使用上述分析器進(jìn)行文本分析,DSL如下:

POST /my_index/_analyze 
{                                  
  "field": "title", 
  "text": "我的酒店" 
}  
{
  "tokens" : [
    {
      "token" : "酒",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "店",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    }
  ]
}

通過以上結(jié)果可以看到,“我的酒店”中的“我”和“的”已經(jīng)被停用詞過濾器過濾,只剩下“酒”和“店”。但是“酒”的開始位置是2,“店”的開始位置是3,說明分析結(jié)果中“我”和“的”的位置被保留了下來,這種特意保留停用詞的方式有助于后續(xù)的模糊搜索。

24. 在內(nèi)置分析器中使用停用詞

① 其實(shí),像standard這種常用的分析器都自帶有停用詞過濾器,只需要對(duì)其參數(shù)進(jìn)行相應(yīng)設(shè)置即可。以下示例中使用standard分析器并通過設(shè)置其stopwords屬性進(jìn)行停用詞的設(shè)定:

PUT /my_index
{ 
  "settings": { 
    "analysis": { 
     "analyzer": {                        
        "my_standard": { 
          "type": "standard",              
          "stopwords":["我","的","這"]     
        } 
      } 
    } 
  }, 
  "mappings": { 
    "properties": { 
      "title": { 
        "type": "text", 
        "analyzer": "my_standard"         
      } 
    } 
  } 
} 

② 使用上述分析器進(jìn)行文本分析,DSL如下:

POST /my_index/_analyze 
{                                  
  "field": "title", 
  "text": "我的酒店" 
} 
{
  "tokens" : [
    {
      "token" : "酒",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "店",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    }
  ]
}

09. ElasticSearch 高亮顯示搜索

25. ElasticSearch 高亮顯示搜索基本使用

在ES中通過設(shè)置DSL的highlight參數(shù)可以對(duì)搜索的字段高亮顯示。

① 索引文檔,構(gòu)造數(shù)據(jù):

PUT /my_index
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "content":{
        "type": "text"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "title": "文雅酒店",
  "content": "Beijing City"
}

PUT /my_index/_doc/2
{
  "title": "孟連酒店",
  "content": "Huaibei City"
}

② 高亮顯示搜索:

GET /my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "金都怡家酒店"
      }
    }
  },
  "highlight": {
    "fields": {
      "title": {}
    }
  }
}

其中設(shè)定對(duì)title字段的匹配結(jié)果進(jìn)行高亮顯示的標(biāo)記標(biāo)簽,此處使用默認(rèn)的HTML標(biāo)簽<em></em>,因此將title對(duì)應(yīng)的值置為空對(duì)象。上述DSL的搜索結(jié)果如下:

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.36464313,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.36464313,
        "_source" : {
          "title" : "文雅酒店",
          "content" : "Beijing City"
        },
        "highlight" : {
          "title" : [
            "文雅<em>酒</em><em>店</em>"
          ]
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.36464313,
        "_source" : {
          "title" : "孟連酒店",
          "content" : "Huaibei City"
        },
        "highlight" : {
          "title" : [
            "孟連<em>酒</em><em>店</em>"
          ]
        }
      }
    ]
  }
}

在每個(gè)搜索結(jié)果中增加了一個(gè)highlight子結(jié)果,其中將查詢字段中匹配上的字符串都用HTML標(biāo)簽<em></em>進(jìn)行了標(biāo)記,這樣的結(jié)果可以直接傳送到前端,前端根據(jù)標(biāo)記標(biāo)簽進(jìn)行特殊化處理即可完成匹配字符串的高亮顯示。

③ 當(dāng)然,如果希望使用其他HTML標(biāo)簽對(duì)匹配內(nèi)容進(jìn)行標(biāo)記,可以在DSL中進(jìn)行更改。以下DSL將匹配內(nèi)容標(biāo)記標(biāo)簽改為了<high></high>

GET /my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "酒店"
      }
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<high>",
        "post_tags": "</high>"
      }
    }
  }
}
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.36464313,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.36464313,
        "_source" : {
          "title" : "文雅酒店",
          "content" : "Beijing City"
        },
        "highlight" : {
          "title" : [
            "文雅<high>酒</high><high>店</high>"
          ]
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.36464313,
        "_source" : {
          "title" : "孟連酒店",
          "content" : "Huaibei City"
        },
        "highlight" : {
          "title" : [
            "孟連<high>酒</high><high>店</high>"
          ]
        }
      }
    ]
  }
}

26. SpringBoot整合ES實(shí)現(xiàn)高亮顯示

@Slf4j
@Service
public class ElasticSearchImpl {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void searchUser() throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // query
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "酒店");
        searchSourceBuilder.query(matchQueryBuilder);

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<high>");
        highlightBuilder.postTags("</high>");
        highlightBuilder.field("title");

        // highlight
        searchSourceBuilder.highlighter(highlightBuilder);

        SearchRequest searchRequest = new SearchRequest(new String[]{"my_index"},searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}

10. ElasticSearch 拼寫糾錯(cuò)

用戶在使用搜索引擎的過程中,輸入的關(guān)鍵詞可能會(huì)出現(xiàn)拼寫錯(cuò)誤的情況。針對(duì)錯(cuò)誤的關(guān)鍵詞,絕大多數(shù)的搜索引擎都能自動(dòng)識(shí)別并進(jìn)行糾正,然后將糾正后的關(guān)鍵詞放到索引中匹配數(shù)據(jù)。如果拼寫錯(cuò)誤特別多導(dǎo)致無法糾正,則會(huì)直接告知用戶當(dāng)前搜索沒有匹配的結(jié)果。

也可以使用ES進(jìn)行拼寫糾錯(cuò),首先需要搜集一段時(shí)間內(nèi)用戶搜索日志中有搜索結(jié)果的查詢詞,然后單獨(dú)建立一個(gè)糾正詞索引。當(dāng)用戶進(jìn)行搜索時(shí),如果在商品索引中沒有匹配到結(jié)果,則在糾正詞索引中進(jìn)行匹配,如果有匹配結(jié)果則給出匹配詞,并給出該匹配詞對(duì)應(yīng)的商品結(jié)果,如果沒有匹配結(jié)果則告知用戶沒有搜索到商品。

在ES中進(jìn)行糾錯(cuò)匹配時(shí)使用fuzzy-match搜索,該搜索使用編輯距離和倒排索引相結(jié)合的形式完成糾錯(cuò),什么是編輯距離呢?詞語A經(jīng)過多次編輯后和詞語B相等,編輯的次數(shù)就叫作編輯距離??梢赃@樣定義一次編輯:替換一個(gè)字符,或刪除一個(gè)字符,或插入一個(gè)字符,或交換兩個(gè)字符的位置。

① 索引文檔:

 PUT /error_correct 
{ 
  "mappings": { 
    "properties": { 
      "hot_word": {   
        "type": "text", 
        "analyzer": "ik_max_word" 
      } 
    } 
  } 
}

POST /_bulk 
{"index":{"_index":"error_correct","_id":"001"}} 
{"hot_word": "王府井"} 
{"index":{"_index":"error_correct","_id":"002"}} 
{"hot_word": "王府中環(huán)"} 
{"index":{"_index":"error_correct","_id":"003"}} 
{"hot_word": "雙井"} 
{"index":{"_index":"error_correct","_id":"004"}} 
{"hot_word": "成府路"} 
{"index":{"_index":"error_correct","_id":"005"}} 
{"hot_word": "大王莊"}

② ES的match查詢支持模糊匹配,這里的模糊匹配指的是ES將查詢文本進(jìn)行分詞進(jìn)而得到分詞列表,然后將列表中的詞語分別和索引中的詞語進(jìn)行匹配,這時(shí)按照編輯距離進(jìn)行模糊匹配,在符合編輯距離閾值的情況下才算是匹配。如下指定編輯距離為1:

GET /error_correct/_search 
{ 
  "query": { 
    "match": { 
      "hot_word":{ 
        "query": "王府景", 
        "operator": "and",  
        "fuzziness": 1             
      } 
    } 
  } 
}
{
  "took" : 1212,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.2354476,
    "hits" : [
      {
        "_index" : "error_correct",
        "_type" : "_doc",
        "_id" : "001",
        "_score" : 1.2354476,
        "_source" : {
          "hot_word" : "王府井"
        }
      },
      {
        "_index" : "error_correct",
        "_type" : "_doc",
        "_id" : "004",
        "_score" : 0.0,
        "_source" : {
          "hot_word" : "成府路"
        }
      }
    ]
  }
}

通過以上結(jié)果可以看出,糾錯(cuò)結(jié)果基本符合預(yù)期,但是“成府路”也出現(xiàn)在搜索結(jié)果中,這是為什么呢?按照hot_word字段默認(rèn)的分析器對(duì)查詢詞“王府景”和查詢詞“成府路”進(jìn)行分析,查詢詞“王府景”被切分成了“王府”和“景”;查詢詞“成府路”被切分成了“成”“府”和“路”。因?yàn)椤巴醺焙汀案钡木庉嬀嚯x為1,符合模糊匹配的編輯距離的閾值,因此“成府路”被匹配上。文章來源地址http://www.zghlxwxcb.cn/news/detail-416868.html

到了這里,關(guān)于ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Elasticsearch 查詢分析器簡介

    Elasticsearch 是一個(gè)開源的分布式搜索和分析引擎,它提供了強(qiáng)大的查詢和分析功能。它基于 Apache Lucene 構(gòu)建,支持大規(guī)模數(shù)據(jù)的實(shí)時(shí)搜索,并具有高可用性和可擴(kuò)展性。 在 Elasticsearch 中,查詢分析器負(fù)責(zé)處理用戶搜索的輸入,將文本進(jìn)行分詞并生成倒排索引。分析器在搜索過

    2024年02月17日
    瀏覽(23)
  • Elasticsearch:搜索及索引分析器

    在我之前的文章 “Elasticsearch: analyzer”,我詳細(xì)介紹了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文檔的時(shí)候需要使用,同時(shí),它也在搜索時(shí),也需要針對(duì)搜索的文字進(jìn)行分詞。在今天的文章中,我們來詳細(xì)介紹分析器是如何在索引及搜索時(shí)使用的。 可以在

    2024年02月05日
    瀏覽(23)
  • ElasticSearch 基礎(chǔ)(七)之分析器

    ElasticSearch 基礎(chǔ)(七)之分析器

    就 ES 基礎(chǔ)部分來說這暫時(shí)就是最后一篇的文章,寫完之后就會(huì)學(xué)習(xí) MQ 了。本篇內(nèi)容簡單了解 ES 的分析器,最重要的還是根據(jù)自己需求去定制自定義分析器,自定義分析器自行了解,這里只是基礎(chǔ)。其他比較重要的就是中文分詞器了,只需要知道常用的幾種中文分詞器就可以

    2024年02月09日
    瀏覽(21)
  • Elasticsearch 分詞器切詞器分析器

    Elasticsearch 分詞器切詞器分析器

    normalization : 文檔規(guī)范化 先切詞,然后規(guī)范化. 規(guī)范化要規(guī)范哪些內(nèi)容? 大小寫; 標(biāo)點(diǎn)符號(hào); 時(shí)態(tài); 復(fù)數(shù); 規(guī)范化主要是為了匹配更精準(zhǔn) character filter : 字符過濾器. 標(biāo)點(diǎn)符號(hào) 分詞之前的預(yù)處理,過濾無用字符 HTML Strip Character Filter :html_strip 參數(shù):escaped_tags 需要保留的html標(biāo)簽 Map

    2024年02月12日
    瀏覽(46)
  • Elasticsearch:Standard Text Analyzer - 標(biāo)準(zhǔn)文本分析器

    Elasticsearch:Standard Text Analyzer - 標(biāo)準(zhǔn)文本分析器

    Elasticsearch 提供了超過很多開箱即用的分析器,我們可以在文本分析階段使用它們。 這些分析器很可能足以滿足基本情況,但如果需要?jiǎng)?chuàng)建自定義分析器,可以通過使用構(gòu)成該模塊的所需組件實(shí)例化一個(gè)新的分析器模塊來實(shí)現(xiàn)。 下表列出了 Elasticsearch 為我們提供的分析器:

    2023年04月26日
    瀏覽(24)
  • 詞法分析器(c++)

    詞法分析器(c++)

    個(gè)人覺得單純是用來完成實(shí)驗(yàn)報(bào)告的話還行,但僅做參考,因?yàn)楸救说木幊趟接邢?,怕誤人子弟。 本次代碼支持以下操作: 單行注釋 多行注釋 文件形式輸入 種別碼可以在文件中自由修改 單詞字符串識(shí)別支持: 部分(可手動(dòng)在程序外部---reference.txt文件添加,),

    2024年02月04日
    瀏覽(19)
  • 分析器:常見問題

    分析器:常見問題

    源生成器(增量生成器)由于它特殊的定位,關(guān)于它的調(diào)試十分困難。在這里分享一些調(diào)試它的經(jīng)驗(yàn)。 另外經(jīng)常有寫類庫,然后提供可以生成代碼的Attribute給用戶的需求,此時(shí)需要用到傳遞引用的知識(shí)點(diǎn)。 源生成器項(xiàng)目和普通的項(xiàng)目不同。 普通的會(huì)在你按下運(yùn)行或調(diào)試后才

    2024年02月01日
    瀏覽(15)
  • 編譯原理———詞法分析器

    編譯原理———詞法分析器

    設(shè)計(jì)并實(shí)現(xiàn)一個(gè)包含預(yù)處理功能的詞法分析程序,加深對(duì)編譯中詞法分析過程的理解。 輸入:所給文法的源程序字符串。 輸出:二元組(syn,token或sum)構(gòu)成的序列。其中, ?syn為單詞種別碼。 ?Token為存放的單詞自身字符串。 ?Sum為整型常量。 具體實(shí)現(xiàn)時(shí),可以將單詞的二

    2024年02月08日
    瀏覽(91)
  • 詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    1.1、實(shí)驗(yàn)?zāi)康?????????加深對(duì)詞法分析器的工作過程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采用一種編程語言實(shí)現(xiàn)簡單的詞法分析程序;能夠使用自己編寫的分析程序?qū)唵蔚某绦蚨芜M(jìn)行詞法分析。 1.2、實(shí)驗(yàn)要求 ? ? ? ? 1)對(duì)單詞的構(gòu)詞規(guī)則有明確的定義; ? ? ?

    2024年02月13日
    瀏覽(16)
  • Lex 生成一個(gè)詞法分析器

    Lex 生成一個(gè)詞法分析器

    ?lex 通過輸入一個(gè).l 文件生成一個(gè)lex.yy.c 文件,然后通過c 編譯器編譯成一個(gè)可執(zhí)行的詞法分析器。 該詞法分析器掃描輸入源文件,生成一個(gè)token 符號(hào)流給后面語法分析器使用。 ? .l 文件的結(jié)構(gòu), 分成三個(gè)部分,聲明, 轉(zhuǎn)換規(guī)則, 自定義規(guī)則。 三個(gè)部分由%%分割 聲明段,

    2024年02月19日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包