zoukankan      html  css  js  c++  java
  • elasticsearch中文搜索优化

    遇到的问题

    1. 检索葡萄糖关键字,希望结果仅包含葡萄糖,不包含葡萄;检索葡萄,希望结果包含葡萄糖。
    2. 同义词如何配置
    3. 如何确保搜索关键词被正确分词

    分析器分词流程

    分析器扮演着非常重要的角色,ES提供的有内置的分析器,社区也提供各种分析器插件(如中文的ik分析器)。分析器由以下几个组件构成

    • 字符过滤器
      主要职责是在分词器前过滤字符流,在源字符流中添加、删除、替换字符。一个分析器中可以有0个或多个字符过滤器。主要包括:html char filter、mapping char filter等
    • 分词器
      主要职责是将接收到的字符流,按照某些规则切分成若干个“词”,并记录这些“词”在源字符串中的位置。分析器中有且只能有一个分词器。
    • 分词过滤器
      主要职责是将分好的“词”进行某种规则的过滤,可以添加、移除、替换“词”,但是不能修改“词”在源字符串中的相对位置。常用的分词过滤器包括:大小写转换过滤器、停用词过滤器、同义词过滤器、拼音过滤器

    ik分词器

    ik分词器介绍
    优化规则:索引时,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词。
    mapping例子

        "arttitle": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
    

    这已经可以解决上述问题一,前提是葡萄和葡萄糖都是关键词。然而在人们日常的搜索需求中,很多短语是相连的,却并不在我们的关键词中,这里我们的解决办法是提供特殊查询接口:短语查询。

    ik同义词

    ik同义词配置

    测试分词

    直接指定分词器

    POST _analyze
    {
      "analyzer": "ik_max_word",
      "text":"你好世界"
    }
    

    指定索引中的字段

    POST weipu/_analyze
    {
      "field":"arttitle",
      "text":"hello world"
    }
    
    
  • 相关阅读:
    多线程22:线程池
    多线程21:信号灯法
    多线程20:管程法
    多线程19:生产者消费者模式
    多线程18:Lock锁
    多线程17:死锁
    多线程16:CopyOnWriteArrayList
    多线程15:线程同步
    多线程14:三大不安全案例
    业余草 maven异常:Updating Maven Project 的统一解决方案
  • 原文地址:https://www.cnblogs.com/zenan/p/11571212.html
Copyright © 2011-2022 走看看