原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

多字段类型

所谓多字段类型,即:一个字段可以有多个子字段。这种特性带来了以下好处。

  1. 增加一个keyword子字段,可用于精确匹配
  2. 可对子字段设置不同的analyzer
    1. 不通语言的支持
    2. 可对中文拼音字段进行搜索
    3. 可对搜索和索引指定不同的Analyzer

精确值和全文本

精确值(Exact Values) vs 全文本(Full Text)

  1. 精确值,包括数字、日期、具体的字符串(如“192.168.0.1”)
    • Elasticsearch中类型为keyword,索引时,不需要做特殊的分词处理
  2. 全文本,非结构化的文本数据
    • Elasticsearch中类型为text,索引时,需要对其进行分词处理

如下结构的数据,我们可以大致判断出哪些是精确值,哪些是全文本。其中的200、info、debug都是精确值。而message的内容为全文本。

  1. {
  2. "code": 200,
  3. "message": "this is a error item, you can change your apollo config !",
  4. "content": {
  5. "tags": [
  6. "info",
  7. "debug"
  8. ]
  9. }
  10. }

自定义分词器

  自定义分词器,可通过组合不同的Character FilterTokenizerToken Filter来实现

   一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

Character Filter(字符过滤器

        字符过滤器 用来 整理 一个尚未被分词的字符串。例如,如果我们的文本是HTML格式的,它会包含像 <p> 或者 <div> 这样的HTML标签,这些标签是我们不想索引的。我们可以使用 html清除 字符过滤器 来移除掉所有的HTML标签,并且像把 &Aacute; 转换为相对应的Unicode字符 Á 这样,转换HTML实体。

一个分析器可能有0个或者多个字符过滤器。

 Character Filter,常用的字符过滤器包括:

html_strip去除html
mapping字符串替换
pattern replace正则匹配替换

Tokenizer(分词器

一个分析器 必须 有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单元。 标准 分析器里使用的 标准 分词器 把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号,然而还有其他不同行为的分词器存在。

例如, 关键词 分词器 完整地输出 接收到的同样的字符串,并不做任何分词。 空格 分词器 只根据空格分割文本 。 正则 分词器 根据匹配正则表达式来分割文本 。

常用的分词器包括:

  • whitespace
  • standard
  • uax_url_email
  • pattern
  • keyword
  • path_hierarchy

  Token Filter (词单元过滤器)

经过分词,作为结果的 词单元流 会按照指定的顺序通过指定的词单元过滤器 。

词单元过滤器可以修改、添加或者移除词单元。 lowercase 和 stop 词过滤器 ,但是在 Elasticsearch 里面还有很多可供选择的词单元过滤器。 词干过滤器 把单词 遏制 为 词干。 ascii_folding 过滤器移除变音符,把一个像 "très" 这样的词转换为 "tres" 。 ngram 和 edge_ngram 词单元过滤器 可以产生 适合用于部分匹配或者自动补全的词单元。

lowercase转换为小写
stop去掉the、a、an等单词
synonym转换为近义词

 学习实例

  1 使用 Character Filter(字符过滤器) 中的mapping

  1. ## 使用 char_filter 的mapping替换 字符
  2. POST _analyze
  3. {
  4. "tokenizer": "standard",
  5. "char_filter": [
  6. { "type":"mapping",
  7. "mappings":[" - => _"]
  8. }
  9. ],
  10. "text": "123-456, I-test! test-990 650-555-1234"
  11. }
  12. #char filter 替换表情符号
  13. POST _analyze
  14. {
  15. "tokenizer": "standard",
  16. "char_filter": [
  17. {
  18. "type" : "mapping",
  19. "mappings" : [ ":) => happy", ":( => sad"]
  20. }
  21. ],
  22. "text": ["I am felling :)", "Feeling :( today"]
  23. }

2 使用Character Filter(字符过滤器) 中的html_strip 去除 html标签

  1. POST _analyze
  2. {
  3. "tokenizer":"keyword",
  4. "char_filter":["html_strip"],
  5. "text": "<b>hello world</b>"
  6. }

3 使用  Token Filter (词单元过滤器)

  1. # white space and snowball
  2. GET _analyze
  3. {
  4. "tokenizer": "whitespace",
  5. "filter": ["stop","snowball"],
  6. "text": ["The gilrs in China are playing this game!"]
  7. }
  8. # white space and stop
  9. POST _analyze
  10. {
  11. "tokenizer": "whitespace",
  12. "filter": ["stop"],
  13. "text": ["The rain in Spain falls mainly on the plain."]
  14. }
  15. #remove 加入lowercase后,The被当成 stopword删除
  16. GET _analyze
  17. {
  18. "tokenizer": "whitespace",
  19. "filter": ["lowercase","stop","snowball"],
  20. "text": ["The gilrs in China are playing this game!"]
  21. }
  22. #正则表达式
  23. GET _analyze
  24. {
  25. "tokenizer": "standard",
  26. "char_filter": [
  27. {
  28. "type" : "pattern_replace",
  29. "pattern" : "http://(.*)",
  30. "replacement" : "$1"
  31. }
  32. ],
  33. "text" : "http://www.elastic.co"
  34. }

自定义分析器标准格式是:

  1. PUT /my_index
  2. {
  3.     "settings": {
  4.         "analysis": {
  5.             "char_filter": { ... custom character filters ... },//字符过滤器
  6.             "tokenizer": { ... custom tokenizers ... },//分词器
  7.             "filter": { ... custom token filters ... }, //词单元过滤器
  8.             "analyzer": { ... custom analyzers ... }//指定选用的自定义分词器
  9.         }
  10.     }
  11. }

1 实例 自定义一个分词器:

      1)把 & 转换为 and 

      2)使用自定义 停止 词过滤器移除自定义的停止词列表中包含的词 [ "the", "a" ]

     3)使用 html清除 字符过滤器移除HTML部分

  1. #自定义分词器
  2. PUT /my_index
  3. {
  4. "settings": {
  5. "analysis": {
  6. "char_filter": {
  7. "&_to_and":{
  8. "type":"mapping",
  9. "mappings" : [ " &=> and"]
  10. }
  11. },
  12. "filter": {
  13. "my_stopwords":{
  14. "type":"stop",
  15. "stopwords": [ "the", "a" ]
  16. }
  17. },
  18. "analyzer": {
  19. "myanalyzer":{
  20. "type":"custom",
  21. "char_filter":[ "html_strip", "&_to_and" ],
  22. "tokenizer": "standard",
  23. "filter": [ "lowercase", "my_stopwords" ]
  24. }
  25. }
  26. }
  27. }
  28. }
  29. 比如自定义好的analyzer名字是my_analyzer,在此索引下的某个新增字段应用此分析器
  30. PUT /my_index/_mapping
  31. {
  32. "properties":{
  33. "username":{
  34. "type":"text",
  35. "analyzer" : "my_analyzer"
  36. },
  37. "password" : {
  38. "type" : "text"
  39. }
  40. }
  41. }
  42. =================插入数据====================
  43. PUT /my_index/_doc/1
  44. {
  45. "username":"The quick & brown fox ",
  46. "password":"The quick & brown fox "
  47. }
  48. ====username采用自定义分析器my_analyzer,password采用默认的standard分析器==
  49. ===验证
  50. GET /index_v1/_analyze
  51. {
  52. "field":"username",
  53. "text":"The quick & brown fox"
  54. }
  55. GET /index_v1/_analyze
  56. {
  57. "field":"password",
  58. "text":"The quick & brown fox"
  59. }
02-13 08:04