好的想法是十分钱一打,真正无价的是能够实现这些想法的人。

社区日报 第1026期 (2020-08-11)

1、在线市场使用Elasticsearch的一些经验心得。
https://apiko.com/blog/elastic ... lace/
2、 如何合理的使用Elasticsearch。
https://dzone.com/articles/how ... er-be
3、如何在HyperNode上使用Elasticsearch。
https://support.hypernode.com/ ... rnode

编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1、在线市场使用Elasticsearch的一些经验心得。
https://apiko.com/blog/elastic ... lace/
2、 如何合理的使用Elasticsearch。
https://dzone.com/articles/how ... er-be
3、如何在HyperNode上使用Elasticsearch。
https://support.hypernode.com/ ... rnode

编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1025期 (2020-08-10)

1.如何优雅的为高版本Elasticsearch自动映射map
https://kuaibao.qq.com/s/20190813A0FAC200

2.怀疑集群性能有问题?来参考一下elastic 官方做的benckmark吧
https://elasticsearch-benchmarks.elastic.co/

3.关于 ELASTICSEARCH 时区的小知识
https://www.easyice.cn/archives/343



编辑:cyberdakk
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.如何优雅的为高版本Elasticsearch自动映射map
https://kuaibao.qq.com/s/20190813A0FAC200

2.怀疑集群性能有问题?来参考一下elastic 官方做的benckmark吧
https://elasticsearch-benchmarks.elastic.co/

3.关于 ELASTICSEARCH 时区的小知识
https://www.easyice.cn/archives/343



编辑:cyberdakk
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

​2. ES之从零开始 | 纠错(Did You Mean)

2. ES之从零开始 - 纠错(Did You Mean)

纠错的另一种说法叫拼写检查(Spell Check),降低由于输入错误导致的不好检索体验。 本文将会分享此类问题的ES解决方案,致力于提升用户的体验。

简单的约定(Simple Convention)

词纠错(Term Suggester)

Elasticsearch通过直接读取Lucene的词库(Term Dictionary)数据并通过莱文斯坦距离(Levenshtein Distance)算法来提供纠错功能。

  1. 模拟拼写错误,发送纠错请求

    • analyzer, 默认采用指定字段的search analzyer, 为了把搜索词当成一个整体,采用了keywrok analyzer.
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "有钱公司",
      "term": {
        "field": "name",
        "analyzer": "keyword"
      }
    }
    }
    }
  2. 根据拼写错误的关键词,获取纠错词

    • options 纠错词列表,获取词库中满足条件的词(默认的最大编辑距离为2,max_edits: 2)
    • score, 编辑距离越短得分越高。
    • freq, lucene 词库中出现的频率。
    {
    "my_suggestion" : [
      {
        "text" : "有钱公司",
        "offset" : 0,
        "length" : 4,
        "options" : [
          {
            "text" : "有限公司",
            "score" : 0.75,
            "freq" : 421
          }
        ]
      }
    ]
    }
  3. 中文不像英文单词那么长,2个字以前都是有出错概率的

    • 期望输入太平,结果输成了太苹
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太苹",
      "term": {
        "field": "name",
        "analyzer": "keyword"
      }
    }
    }
    }
  4. Demo 3的纠错请求结果

    {
    "my_suggestion" : [
      {
        "text" : "太苹",
        "offset" : 0,
        "length" : 2,
        "options" : [ ]
      }
    ]
    }
    
  5. 原来是两个参数限制了结果的返回

    • min_word_length, 表示只有当关键词长度大于等于该值时,才会进行纠错
    • suggest_mode, 默认只有当搜索词在词库中不存在时,再会进行纠错
      • missing, 搜索词不存在于词库中,执行搜索逻辑(默认)
      • popular, 只返回频率大于原始词的纠错词
      • always, 始终返回任何命中的纠错词
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太苹",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  6. 两个字纠错结果

    {
    "my_suggestion" : [
      {
        "text" : "太苹",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太平",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  7. suggest_mode 之always

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  8. suggest_mode 之always 结果

    • 返回了所有命中的纠错词
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  9. suggest_mode 之popular

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "popular",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  10. suggest_mode 之popular结果

    • 太平在词库中 出现过1次
    • popular 应该返回频率大于1的纠错词
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          }
        ]
      }
    ]
    }
  11. 通过编辑距离控制纠错词列表

    • max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
      • 编辑距离为1时,召回搜索词与词库中只错一个字符的词。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "max_edits": 1
      }
    }
    }
    }
  12. 通过编辑距离控制纠错词列表结果

    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  13. 纠错词的排序与返回个数

    • size, 每个词返回的最大纠错词
    • sort, 返回纠错词的顺序
      • score, 三层排序,先根据编辑距离得分倒序,再根据纠错词频率倒序,最后纠错词的字典序
      • frequency, 三层排序,先根据纠错词频率倒序,再根据编辑距离得分倒序,最后纠错词的字典序
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "size": 2,
        "sort": "score"
      }
    }
    }
    }
  14. 纠错词的排序与返回个数结果

    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
    }
  15. 编辑距离与得分

    • internal, 距离越小得分越高。
    • jaro_winkler JW算法 ,在internal 基本上也考虑了通用的前缀的加权逻辑。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "string_distance": "jaro_winkler"
      }
    }
    }
    }
  16. 编辑距离与得分结果

    • 太平洋和太原编辑距离都是1
      • internal 都是0.5分,相同的编辑距离
      • jaro_winkler 太平洋得分要远高于太原,因为太平洋在词库中有一个通用的前缀太平
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.9111111,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.6666667,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.6666667,
            "freq" : 1
          }
        ]
      }
    ]
    }
  17. 通过纠错词最小文档阀值限制返回的个数

    • min_doc_freq, 纠错词最小文档阀值,类型可为数值和百分比。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "福地",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "size": 20,
        "min_doc_freq":3
      }
    }
    }
    }
  18. 通过纠错词频率限制控制返回的个数

    {
    "my_suggestion" : [
      {
        "text" : "福地",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "福建",
            "score" : 0.5,
            "freq" : 4
          }
        ]
      }
    ]
    }
  19. 第一个字错了,可以纠正么?

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  20. 第一个字错了,在上述语法中无法正常纠正

    {
    "my_suggestion" : [
      {
        "text" : "大平洋",
        "offset" : 0,
        "length" : 3,
        "options" : [ ]
      }
    ]
    }
  21. 第一个字错了的正确纠正DSL

    • prefix_length, 只纠正满足前缀条件的搜索词,默认值为1
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "prefix_length": 0
      }
    }
    }
    }
  22. 第一个字错了的正确纠正结果

    {
    "my_suggestion" : [
      {
        "text" : "大平洋",
        "offset" : 0,
        "length" : 3,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.6666666,
            "freq" : 2
          },
          {
            "text" : "平洋",
            "score" : 0.5,
            "freq" : 2
          }
        ]
      }
    ]
    }
  23. suggest计算是分片级的,而最终的TOP K 可能会出现频率统计精度丢失,可以通过shard_size来修正

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "prefix_length": 0,
        "shard_size": 10
      }
    }
    }
    }
  24. 公司名称纠错

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "华侨集团有限公司",
      "term": {
        "field": "name",
        "suggest_mode": "always"
      }
    }
    }
    }
  25. 公司名称纠错结果

    • 通常公司名称都是分词字段,使用默认 search_analyzer或者 keyword analyzer 都无法针对完整公司名纠错。
    {
    "my_suggestion" : [
      {
        "text" : "华侨",
        "offset" : 0,
        "length" : 2,
        "options" : [ ]
      },
      {
        "text" : "集团",
        "offset" : 2,
        "length" : 2,
        "options" : [ ]
      },
      {
        "text" : "有限公司",
        "offset" : 4,
        "length" : 4,
        "options" : [ ]
      }
    ]
    }

短语纠错(Phrase Suggester)

多个词组合成一个整体进行拼写错误纠错。

  1. 短语纠错 查询

    • direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
      • 生成器,内部的参数与词纠错一致。
    • max_errors, 只允许纠错 max_errors个词
    • highlight, 纠错词高亮
    • collate, 短语纠错不能保证命中文档,通过collate指定查询语句来标识是否命中文档。
      • prune, 返回结果中标识是否命中
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "中国石头化工集团有限公司",
      "phrase": {
        "field": "name",
        "size": 3,
        "direct_generator": [
          {
            "field": "name",
            "size": 1,
            "max_edits": 1,
            "min_word_length": 2,
            "suggest_mode": "always"
          }
        ],
        "max_errors": 1,
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        },
        "collate": {
          "query": {
            "source": {
              "match": {
                "{{field_name}}": "{{suggestion}}"
              }
            }
          },
          "params": {
            "field_name": "name"
          },
          "prune": true
        }
      }
    }
    }
    }
  2. 短语纠错 结果

    • collate_match, 标识是否命中文档
    {
    "my_suggestion" : [
      {
        "text" : "中国石头化工集团有限公司",
        "offset" : 0,
        "length" : 12,
        "options" : [
          {
            "text" : "中国 石油 化工 集团 有限公司",
            "highlighted" : "中国 <em>石油</em> 化工 集团 有限公司",
            "score" : 4.7643356E-5,
            "collate_match" : true
          }
        ]
      }
    ]
    }

小结

  • 在ES中,仅返回当搜索组不在词库中,且词库中存在与搜索词小于2个编辑距离的词作为候选。
  • 短语纠错词列表默认是不检查纠错后的短语能否命中文档的。
  • 在短语纠错中,collate 是必要的,否则无法保障纠错后的词能命中结果。
继续阅读 »

2. ES之从零开始 - 纠错(Did You Mean)

纠错的另一种说法叫拼写检查(Spell Check),降低由于输入错误导致的不好检索体验。 本文将会分享此类问题的ES解决方案,致力于提升用户的体验。

简单的约定(Simple Convention)

词纠错(Term Suggester)

Elasticsearch通过直接读取Lucene的词库(Term Dictionary)数据并通过莱文斯坦距离(Levenshtein Distance)算法来提供纠错功能。

  1. 模拟拼写错误,发送纠错请求

    • analyzer, 默认采用指定字段的search analzyer, 为了把搜索词当成一个整体,采用了keywrok analyzer.
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "有钱公司",
      "term": {
        "field": "name",
        "analyzer": "keyword"
      }
    }
    }
    }
  2. 根据拼写错误的关键词,获取纠错词

    • options 纠错词列表,获取词库中满足条件的词(默认的最大编辑距离为2,max_edits: 2)
    • score, 编辑距离越短得分越高。
    • freq, lucene 词库中出现的频率。
    {
    "my_suggestion" : [
      {
        "text" : "有钱公司",
        "offset" : 0,
        "length" : 4,
        "options" : [
          {
            "text" : "有限公司",
            "score" : 0.75,
            "freq" : 421
          }
        ]
      }
    ]
    }
  3. 中文不像英文单词那么长,2个字以前都是有出错概率的

    • 期望输入太平,结果输成了太苹
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太苹",
      "term": {
        "field": "name",
        "analyzer": "keyword"
      }
    }
    }
    }
  4. Demo 3的纠错请求结果

    {
    "my_suggestion" : [
      {
        "text" : "太苹",
        "offset" : 0,
        "length" : 2,
        "options" : [ ]
      }
    ]
    }
    
  5. 原来是两个参数限制了结果的返回

    • min_word_length, 表示只有当关键词长度大于等于该值时,才会进行纠错
    • suggest_mode, 默认只有当搜索词在词库中不存在时,再会进行纠错
      • missing, 搜索词不存在于词库中,执行搜索逻辑(默认)
      • popular, 只返回频率大于原始词的纠错词
      • always, 始终返回任何命中的纠错词
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太苹",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  6. 两个字纠错结果

    {
    "my_suggestion" : [
      {
        "text" : "太苹",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太平",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  7. suggest_mode 之always

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  8. suggest_mode 之always 结果

    • 返回了所有命中的纠错词
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  9. suggest_mode 之popular

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "popular",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  10. suggest_mode 之popular结果

    • 太平在词库中 出现过1次
    • popular 应该返回频率大于1的纠错词
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          }
        ]
      }
    ]
    }
  11. 通过编辑距离控制纠错词列表

    • max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
      • 编辑距离为1时,召回搜索词与词库中只错一个字符的词。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "max_edits": 1
      }
    }
    }
    }
  12. 通过编辑距离控制纠错词列表结果

    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
  13. 纠错词的排序与返回个数

    • size, 每个词返回的最大纠错词
    • sort, 返回纠错词的顺序
      • score, 三层排序,先根据编辑距离得分倒序,再根据纠错词频率倒序,最后纠错词的字典序
      • frequency, 三层排序,先根据纠错词频率倒序,再根据编辑距离得分倒序,最后纠错词的字典序
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "size": 2,
        "sort": "score"
      }
    }
    }
    }
  14. 纠错词的排序与返回个数结果

    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.5,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      }
    ]
    }
    }
  15. 编辑距离与得分

    • internal, 距离越小得分越高。
    • jaro_winkler JW算法 ,在internal 基本上也考虑了通用的前缀的加权逻辑。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "太平",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "string_distance": "jaro_winkler"
      }
    }
    }
    }
  16. 编辑距离与得分结果

    • 太平洋和太原编辑距离都是1
      • internal 都是0.5分,相同的编辑距离
      • jaro_winkler 太平洋得分要远高于太原,因为太平洋在词库中有一个通用的前缀太平
    {
    "my_suggestion" : [
      {
        "text" : "太平",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.9111111,
            "freq" : 2
          },
          {
            "text" : "太原",
            "score" : 0.6666667,
            "freq" : 1
          },
          {
            "text" : "太极",
            "score" : 0.6666667,
            "freq" : 1
          }
        ]
      }
    ]
    }
  17. 通过纠错词最小文档阀值限制返回的个数

    • min_doc_freq, 纠错词最小文档阀值,类型可为数值和百分比。
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "福地",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "size": 20,
        "min_doc_freq":3
      }
    }
    }
    }
  18. 通过纠错词频率限制控制返回的个数

    {
    "my_suggestion" : [
      {
        "text" : "福地",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "福建",
            "score" : 0.5,
            "freq" : 4
          }
        ]
      }
    ]
    }
  19. 第一个字错了,可以纠正么?

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword"
      }
    }
    }
    }
  20. 第一个字错了,在上述语法中无法正常纠正

    {
    "my_suggestion" : [
      {
        "text" : "大平洋",
        "offset" : 0,
        "length" : 3,
        "options" : [ ]
      }
    ]
    }
  21. 第一个字错了的正确纠正DSL

    • prefix_length, 只纠正满足前缀条件的搜索词,默认值为1
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "prefix_length": 0
      }
    }
    }
    }
  22. 第一个字错了的正确纠正结果

    {
    "my_suggestion" : [
      {
        "text" : "大平洋",
        "offset" : 0,
        "length" : 3,
        "options" : [
          {
            "text" : "太平洋",
            "score" : 0.6666666,
            "freq" : 2
          },
          {
            "text" : "平洋",
            "score" : 0.5,
            "freq" : 2
          }
        ]
      }
    ]
    }
  23. suggest计算是分片级的,而最终的TOP K 可能会出现频率统计精度丢失,可以通过shard_size来修正

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "大平洋",
      "term": {
        "field": "name",
        "suggest_mode": "always",
        "min_word_length": 2,
        "analyzer": "keyword",
        "prefix_length": 0,
        "shard_size": 10
      }
    }
    }
    }
  24. 公司名称纠错

    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "华侨集团有限公司",
      "term": {
        "field": "name",
        "suggest_mode": "always"
      }
    }
    }
    }
  25. 公司名称纠错结果

    • 通常公司名称都是分词字段,使用默认 search_analyzer或者 keyword analyzer 都无法针对完整公司名纠错。
    {
    "my_suggestion" : [
      {
        "text" : "华侨",
        "offset" : 0,
        "length" : 2,
        "options" : [ ]
      },
      {
        "text" : "集团",
        "offset" : 2,
        "length" : 2,
        "options" : [ ]
      },
      {
        "text" : "有限公司",
        "offset" : 4,
        "length" : 4,
        "options" : [ ]
      }
    ]
    }

短语纠错(Phrase Suggester)

多个词组合成一个整体进行拼写错误纠错。

  1. 短语纠错 查询

    • direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
      • 生成器,内部的参数与词纠错一致。
    • max_errors, 只允许纠错 max_errors个词
    • highlight, 纠错词高亮
    • collate, 短语纠错不能保证命中文档,通过collate指定查询语句来标识是否命中文档。
      • prune, 返回结果中标识是否命中
    GET top500_company_names/_search
    {
    "suggest": {
    "my_suggestion": {
      "text": "中国石头化工集团有限公司",
      "phrase": {
        "field": "name",
        "size": 3,
        "direct_generator": [
          {
            "field": "name",
            "size": 1,
            "max_edits": 1,
            "min_word_length": 2,
            "suggest_mode": "always"
          }
        ],
        "max_errors": 1,
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        },
        "collate": {
          "query": {
            "source": {
              "match": {
                "{{field_name}}": "{{suggestion}}"
              }
            }
          },
          "params": {
            "field_name": "name"
          },
          "prune": true
        }
      }
    }
    }
    }
  2. 短语纠错 结果

    • collate_match, 标识是否命中文档
    {
    "my_suggestion" : [
      {
        "text" : "中国石头化工集团有限公司",
        "offset" : 0,
        "length" : 12,
        "options" : [
          {
            "text" : "中国 石油 化工 集团 有限公司",
            "highlighted" : "中国 <em>石油</em> 化工 集团 有限公司",
            "score" : 4.7643356E-5,
            "collate_match" : true
          }
        ]
      }
    ]
    }

小结

  • 在ES中,仅返回当搜索组不在词库中,且词库中存在与搜索词小于2个编辑距离的词作为候选。
  • 短语纠错词列表默认是不检查纠错后的短语能否命中文档的。
  • 在短语纠错中,collate 是必要的,否则无法保障纠错后的词能命中结果。
收起阅读 »

社区日报 第1024期 (2020-08-09)

1.Elasticsearch-启用TLS加密和HTTPS通信。
https://techexpert.tips/elasti ... ttps/
2.通过设置TLS和调整CORS权限在Elastic服务器上加密通信。
https://blogs.query.ai/encrypt ... erver
3.Docker容器日志存储在哪里?
https://sematext.com/blog/docker-logs-location/

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.Elasticsearch-启用TLS加密和HTTPS通信。
https://techexpert.tips/elasti ... ttps/
2.通过设置TLS和调整CORS权限在Elastic服务器上加密通信。
https://blogs.query.ai/encrypt ... erver
3.Docker容器日志存储在哪里?
https://sematext.com/blog/docker-logs-location/

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1021期 (2020-08-06)

1.沪江搜索平台化之路
https://mp.weixin.qq.com/s/NNYGMiLyxChD0RtlnHxeXQ
2.携程机票大数据架构最佳实践
https://mp.weixin.qq.com/s/CWAWU9gpKk0VFsocBO32Iw
3.海量日志架构中的后端数据处理技术对比
https://www.infoq.cn/article/d ... ison/

编辑:江水
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
 
继续阅读 »
1.沪江搜索平台化之路
https://mp.weixin.qq.com/s/NNYGMiLyxChD0RtlnHxeXQ
2.携程机票大数据架构最佳实践
https://mp.weixin.qq.com/s/CWAWU9gpKk0VFsocBO32Iw
3.海量日志架构中的后端数据处理技术对比
https://www.infoq.cn/article/d ... ison/

编辑:江水
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
  收起阅读 »

社区日报 第1022期 (2020-08-07)

1、配置高性能 ElasticSearch 搜索引擎集群的9个小贴士
http://www.codeceo.com/article ... .html
2、警惕!!Meow 攻击自动删除不安全的 Elasticsearch 数据库
https://www.solidot.org/story?sid=65058
3、Elasticsearch 性能优化实战
https://dzone.com/articles/how ... ch-pe

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

 
继续阅读 »
1、配置高性能 ElasticSearch 搜索引擎集群的9个小贴士
http://www.codeceo.com/article ... .html
2、警惕!!Meow 攻击自动删除不安全的 Elasticsearch 数据库
https://www.solidot.org/story?sid=65058
3、Elasticsearch 性能优化实战
https://dzone.com/articles/how ... ch-pe

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

  收起阅读 »

社区日报 第1018期 (2020-08-03)

1.Elasticsearch用得好,下班下得早
http://t.cn/A6U5iS7c

2.图文教你汉化kibana 7.6.2,同样适用高版本
http://t.cn/A6U56PpB

3.关于分布式日志平台的思考
http://t.cn/A6U56V9u

编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.Elasticsearch用得好,下班下得早
http://t.cn/A6U5iS7c

2.图文教你汉化kibana 7.6.2,同样适用高版本
http://t.cn/A6U56PpB

3.关于分布式日志平台的思考
http://t.cn/A6U56V9u

编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1020期 (2020-08-05)

1. Elasticsearch常见的8种错误及最佳实践;
http://tinyurl.com/y3ebgcl3
2. 使用elastic app search构建python web应用;
http://tinyurl.com/yyw98oeo
3. 数据科学更简单地使用elasticsearch的方法
http://tinyurl.com/y2d5nkzv

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1. Elasticsearch常见的8种错误及最佳实践;
http://tinyurl.com/y3ebgcl3
2. 使用elastic app search构建python web应用;
http://tinyurl.com/yyw98oeo
3. 数据科学更简单地使用elasticsearch的方法
http://tinyurl.com/y2d5nkzv

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1019期 (2020-08-04)

1. 聊聊 Elasticsearch 的查询毛刺;
http://tinyurl.com/yxufgt4z
2. 使用预先训练的语言模型和ES进行文本相似性分析;(自备梯子)
http://tinyurl.com/y6jwyoak
3. 阿里云 Elasticsearch 弹性伸缩能力如何帮助减少47%成本
http://tinyurl.com/y3p7ntm3

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1. 聊聊 Elasticsearch 的查询毛刺;
http://tinyurl.com/yxufgt4z
2. 使用预先训练的语言模型和ES进行文本相似性分析;(自备梯子)
http://tinyurl.com/y6jwyoak
3. 阿里云 Elasticsearch 弹性伸缩能力如何帮助减少47%成本
http://tinyurl.com/y3p7ntm3

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1017期 (2020-08-02)

1.了解Node.js中的Elasticsearch查询主体构建器。
http://t.cn/Aiex3GOj
2.Elasticsearch初学者教程。 迈出第一步并与Node.js专家一起学习实用技巧。
http://t.cn/A6UGf3Xb
3.如何聘请Angular开发人员?
http://t.cn/A6UGfk2o

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.了解Node.js中的Elasticsearch查询主体构建器。
http://t.cn/Aiex3GOj
2.Elasticsearch初学者教程。 迈出第一步并与Node.js专家一起学习实用技巧。
http://t.cn/A6UGf3Xb
3.如何聘请Angular开发人员?
http://t.cn/A6UGfk2o

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1016期 (2020-08-01)

1.在 ES 中使用语言识别进行多语言搜索

http://t.cn/A6UbzRul

2.ES重命名字段的方法

http://t.cn/A6UbzRuj

3.使用ES,Kubeflow和Katib构建一个基于AI的搜索引擎

http://t.cn/A6UbzRuW

继续阅读 »

1.在 ES 中使用语言识别进行多语言搜索

http://t.cn/A6UbzRul

2.ES重命名字段的方法

http://t.cn/A6UbzRuj

3.使用ES,Kubeflow和Katib构建一个基于AI的搜索引擎

http://t.cn/A6UbzRuW

收起阅读 »

社区日报 第1015期 (2020-07-31)

1、eland:elasticsearch 数据处理 python 客户端
http://t.cn/A6yODplr
2、Elasticsearch遇上BERT:使用Elasticsearch和BERT构建搜索引擎
https://tinyurl.com/y6lj3yl9
3、ELK 日志分析实践
http://tinyurl.mobi/9dED

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
 
继续阅读 »
1、eland:elasticsearch 数据处理 python 客户端
http://t.cn/A6yODplr
2、Elasticsearch遇上BERT:使用Elasticsearch和BERT构建搜索引擎
https://tinyurl.com/y6lj3yl9
3、ELK 日志分析实践
http://tinyurl.mobi/9dED

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
  收起阅读 »

社区日报 第1014期 (2020-07-30)

1.PB级大规模Elasticsearch集群运维与调优实践
http://t.cn/A6UArlyH
2.Elasticsearch升级7.x版本后踩坑指南
http://t.cn/A6ULPyVt
3.kibana:运用 agggregation 的高级设置来微调统计结果
http://t.cn/A6ULPQcv

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.PB级大规模Elasticsearch集群运维与调优实践
http://t.cn/A6UArlyH
2.Elasticsearch升级7.x版本后踩坑指南
http://t.cn/A6ULPyVt
3.kibana:运用 agggregation 的高级设置来微调统计结果
http://t.cn/A6ULPQcv

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

社区日报 第1013期 (2020-07-29)

1、使用elasticsearch构建基于向量的语义搜索;
http://tinyurl.com/y48nehb3
2、如何3分钟构建语义搜索引擎;
http://tinyurl.com/yc76paw4
3、Elasticsearch 7.7 的异步搜索原理解析;
http://tinyurl.com/y65mk5nv

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1、使用elasticsearch构建基于向量的语义搜索;
http://tinyurl.com/y48nehb3
2、如何3分钟构建语义搜索引擎;
http://tinyurl.com/yc76paw4
3、Elasticsearch 7.7 的异步搜索原理解析;
http://tinyurl.com/y65mk5nv

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »