zoukankan      html  css  js  c++  java
  • Elasticsearch学习之SearchRequestBuilder的query类型

    1. 分词的时机

      对于ES来讲,可以对文档的内容进行分词(前提是设置了analyzed),也可以对输入的搜索词进行分词。对输入的搜索词进行分词时需要看下使用的什么类型的query。不同的query可能会对词进行分词,也可能不分词。无论是文档分词还是搜索词分词,依赖于使用的是什么分词器。分词的结果和分词规则(假设使用的是默认的standard),去掉大部分标点符号,并以此分割原词为多个词,把分分割后的词转为小写(汉字的话分完的结果)放入token组中,对于not-analyzed的词,直接把原词放入token组中。如下所示:

    http://192.168.1.114:9200/_analyze?pretty&analyzer=standard&text=销售管理,结果:

    {  
        tokens: [  
            {  
                token: "",  
                start_offset: 0,  
                end_offset: 1,  
                type: "<IDEOGRAPHIC>",  
                position: 0  
            },  
            {  
                token: "",  
                start_offset: 1,  
                end_offset: 2,  
                type: "<IDEOGRAPHIC>",  
                position: 1  
            },  
            {  
                token: "",  
                start_offset: 2,  
                end_offset: 3,  
                type: "<IDEOGRAPHIC>",  
                position: 2  
            },  
            {  
                token: "",  
                start_offset: 3,  
                end_offset: 4,  
                type: "<IDEOGRAPHIC>",  
                position: 3  
            }  
        ]  
    }  

    如果进行搜索的时候会使用倒排索引的方式进行查找。
    使用不同类型的query进行搜索
    1. termQuery的机制是:直接去匹配token,如上面的分词结果如果是
      termQuery(销售)//无结果,token数组不存在
      termQuery(销)//  有结果,token数组中存在
      termQuery(售)//  有结果,token数组中存在
    2. matchQuery的机制是:先检查搜索的字段类型是否是analyzed,如果是,则先使用分词器分词,再去去匹配token;如果查询的字段没有被分词,则直接去匹配token。
      matchQuery(销售)
      2.1 如果查询的'销售' 字段在建索引的时候没有指定not_analyzed,那么会先进行分词在查询。会分为'销'和'售',然后依次进行查询。
      2.2 如果指定了not_analyzed,那么将直接使用'销售'进行查询。

  • 相关阅读:
    搭建Jumpserver
    支付功能流程图
    我是如何招聘程序员的
    从问题域看hadoop的各种技术
    转一篇做BI项目的好文
    关于数据倾斜的问题
    技能的十一个级别
    企业计划体系的变迁:从ERP到APS再到SCP
    别浪费自己的高学历
    一个CTO谈自己的技术架构体系
  • 原文地址:https://www.cnblogs.com/sunfie/p/9030372.html
Copyright © 2011-2022 走看看