image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png使用中文分词后的结果为:

  1. {
  2. "tokens": [
  3. {
  4. "token": "测试",
  5. "start_offset": 0,
  6. "end_offset": 2,
  7. "type": "CN_WORD",
  8. "position": 0
  9. },
  10. {
  11. "token": "单词",
  12. "start_offset": 2,
  13. "end_offset": 4,
  14. "type": "CN_WORD",
  15. "position": 1
  16. }
  17. ]
  18. }

ES 中也可以进行扩展词汇,首先查询

  1. #GET http://localhost:9200/_analyze
  2. {
  3. "text":"弗雷尔卓德",
  4. "analyzer":"ik_max_word"
  5. }

仅仅可以得到每个字的分词结果,我们需要做的就是使分词器识别到弗雷尔卓德也是一个词语。

  1. {
  2. "tokens": [
  3. {
  4. "token": "弗",
  5. "start_offset": 0,
  6. "end_offset": 1,
  7. "type": "CN_CHAR",
  8. "position": 0
  9. },
  10. {
  11. "token": "雷",
  12. "start_offset": 1,
  13. "end_offset": 2,
  14. "type": "CN_CHAR",
  15. "position": 1
  16. },
  17. {
  18. "token": "尔",
  19. "start_offset": 2,
  20. "end_offset": 3,
  21. "type": "CN_CHAR",
  22. "position": 2
  23. },
  24. {
  25. "token": "卓",
  26. "start_offset": 3,
  27. "end_offset": 4,
  28. "type": "CN_CHAR",
  29. "position": 3
  30. },
  31. {
  32. "token": "德",
  33. "start_offset": 4,
  34. "end_offset": 5,
  35. "type": "CN_CHAR",
  36. "position": 4
  37. }
  38. ]
  39. }
  1. 首先进入 ES 根目录中的 plugins 文件夹下的 ik 文件夹,进入 config 目录,创建 custom.dic文件,写入“弗雷尔卓德”。
  2. 同时打开 IKAnalyzer.cfg.xml 文件,将新建的 custom.dic 配置其中。
  3. 重启 ES 服务器 。 ``` <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE properties SYSTEM “http://java.sun.com/dtd/properties.dtd"> IK Analyzer 扩展配置 custom.dic
  1. 扩展后再次查询

GET http://localhost:9200/_analyze

{ “text”:”测试单词”, “analyzer”:”ik_max_word” }

  1. 返回结果如下:

{ “tokens”: [ { “token”: “弗雷尔卓德”, “start_offset”: 0, “end_offset”: 5, “type”: “CN_WORD”, “position”: 0 } ] }

  1. 自定义分析器<br />虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。在分析与分析器我们说过,一个分析器就是在一个包里面组合了三种函数的一个包装器,三种函数按照顺序被执行:
  2. 字符过滤器<br />字符过滤器用来整理一个尚未被分词的字符串。例如,如果我们的文本是HTML格式的,它会包含像<p>或者<div>这样的HTML标签,这些标签是我们不想索引的。我们可以使用html清除字符过滤器来移除掉所有的HTML标签,并且像把&Aacute;转换为相对应的Unicode字符Á 这样,转换HTML实体。一个分析器可能有0个或者多个字符过滤器。
  3. 分词器<br />一个分析器必须有一个唯一的分词器。分词器把字符串分解成单个词条或者词汇单元。标准分析器里使用的标准分词器把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号,然而还有其他不同行为的分词器存在。
  4. 例如,关键词分词器完整地输出接收到的同样的字符串,并不做任何分词。空格分词器只根据空格分割文本。正则分词器根据匹配正则表达式来分割文本。
  5. 词单元过滤器<br />经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器。词单元过滤器可以修改、添加或者移除词单元。我们已经提到过lowercasestop词过滤器,但是在Elasticsearch 里面还有很多可供选择的词单元过滤器。词干过滤器把单词遏制为词干。ascii_folding过滤器移除变音符,把一个像"très”这样的词转换为“tres”。
  6. ngram和 edge_ngram词单元过滤器可以产生适合用于部分匹配或者自动补全的词单元。

PUT http://localhost:9200/my_index

{ “settings”: { “analysis”: { “char_filter”: { “&_to_and”: { “type”: “mapping”, “mappings”: [ “&=> and “ ] } }, “filter”: { “my_stopwords”: { “type”: “stop”, “stopwords”: [ “the”, “a” ] } }, “analyzer”: { “my_analyzer”: { “type”: “custom”, “char_filter”: [ “html_strip”, “&_to_and” ], “tokenizer”: “standard”, “filter”: [ “lowercase”, “my_stopwords” ] } } } } }

  1. 索引被创建以后,使用 analyze API 测试这个新的分析器:

GET http://127.0.0.1:9200/my_index/_analyze

{ “text”:”The quick & brown fox”, “analyzer”: “my_analyzer” }

  1. 返回结果为:

{ “tokens”: [ { “token”: “quick”, “start_offset”: 4, “end_offset”: 9, “type”: ““, “position”: 1 }, { “token”: “and”, “start_offset”: 10, “end_offset”: 11, “type”: ““, “position”: 2 }, { “token”: “brown”, “start_offset”: 12, “end_offset”: 17, “type”: ““, “position”: 3 }, { “token”: “fox”, “start_offset”: 18, “end_offset”: 21, “type”: ““, “position”: 4 } ] }

```