您的位置:首页 > 其它

elasticsearch核心知识--6.多种搜索方式和分析器等解释

2018-03-20 13:13 543 查看
####################################################################################################
es默认的分析器时standard的分析器,查询时可用指定分析器,也可不指定。term和match查询时大致区别如下:
比如默认的data 采用的是标准standard的分析器  “数据9”->【数   据   9】
GET  /indexpage/typepage/_search
{
  "query": {
    "term": {
      "data": {
        "value": "数据"    采用term时,会把“数据”这个字符串作为一个整体 去索引的字段data的 tokens里面去匹配。
      }
    }
  }
}

GET /indexpage/typepage/_search
{
  "query": {
    "match": {
      "data": "数据"    采用match时 默认采用和存储data字段的分析器时同一种分析器。会将数据->分析成【数    据】两个字符串进行匹配。
    }
  }
}#####################################################################################本文主要介绍如下6种方式的查询1、query string search2、query DSL
3、query filter
4、full-text search
5、phrase search
6、highlight search##1.查询query string search#####1、query string search
搜索全部商品:GET /ecommerce/product/_search
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,3个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "jiajieshi yagao",
          "desc": "youxiao fangzhu",
          "price": 25,
          "producer": "jiajieshi producer",
          "tags": [
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "gaolujie yagao",
          "desc": "gaoxiao meibai",
          "price": 30,
          "producer": "gaolujie producer",
          "tags": [
            "meibai",
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "zhonghua yagao",
          "desc": "caoben zhiwu",
          "price": 40,
          "producer": "zhonghua producer",
          "tags": [
            "qingxin"
          ]
        }
      }
    ]
  }

}
query string search的由来,因为search参数都是以http请求的query string来附带的
搜索商品名称中包含yagao的商品,而且按照售价降序排序:GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息;但是如果查询请求很复杂,是很难去构建的
在生产环境中,几乎很少使用query string search
2、query DSL
DSL:Domain Specified Language,特定领域的语言

http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search肯定强大多了.
查询名称包含yagao的商品,同时按照价格降序排序
GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "name" : "yagao"
        }
    },
    "sort": [
        { "price": "desc" }
    ]
}
分页查询商品,总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品
GET /ecommerce/product/_search
{
  "query": { "match_all": {} },
  "from": 1,
  "size": 1

}
###from size 应该回去每个分片查询数据 然后进行排序 最终返回结果
指定要查询出来商品的名称和价格就可以
GET /ecommerce/product/_search
{
  "query": { "match_all": {} },
  "_source": ["name", "price"]
}
更加适合生产环境的使用,可以构建复杂的查询
3、query filter
搜索商品名称包含yagao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
    "query" : {
        "bool" : {
            "must" : {
                "match" : {
                    "name" : "yagao" 
                }
            },
            "filter" : {
                "range" : {
                    "price" : { "gt" : 25 } 
                }
            }
        }
    }
}
4、full-text search(全文检索) 这里查询时 由于默认的采用的分析器是standard的分析器  会以空格分词 。
####Analyzer(分析器)由Tokenizer(分词器)和Filter(过滤器)组成。####对底层数据存储也是按照standard的分析器分析后对term进行存储的,查询的时候也是一样。会将查询的字符串按照standard的分析器进行分析 最终得到term,然后在和底层进行匹配。
GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "yagao producer"
        }
    }
}
special 4
yagao 4
producer 1,2,3,4
gaolujie 1
zhognhua 3
jiajieshi 2
yagao producer ---> yagao和producer
5、phrase search(短语搜索)

跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回

phrase search:也叫临近词查询   eg:  查询的是  “a   b”  那么也会先分析器转化为term  但是去匹配的时候 必须是数据中的term的数组或者集合 和a ,b 在顺序和内容上保持一致才能匹配出。 如果数据是 a c b 进行分析器进行存储的,那是匹配不到的
GET /ecommerce/product/_search
{
    "query" : {
        "match_phrase" : {
            "producer" : "yagao producer"
        }
    }

}

6、highlight search(高亮搜索结果)

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "producer"
        }
    },
    "highlight": {
        "fields" : {
            "producer" : {}
        }
    }

}
这里的higlight和query属于同一级目录。
############测试某些分词器###############
***以ecommerce索引里的producer的分析器来存储"jiajieshi producer mmy"这个内容 查看底层如何存储GET /ecommerce/_analyze?field=producer
{
  "text": "jiajieshi producer mmy"

}
#查看索引ecommerce的mappings
GET /ecommerce/_mappings?pretty

以ecommerce索引里es的内置分析器standard来存储"jiajieshi producer mmy"这个内容 查看底层如何存储
GET /ecommerce/_analyze?analyzer=standard
{
  "text": "jiajieshi producer mmy"
}

###以默认的whitespace分词器来分词
GET /ecommerce/_analyze?analyzer=whitespace
{
  "text": "我是中国人"
}

############这一部分是copy来的######################一、概念介绍    全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)。整个分析过程,如下图所示:二、ES中的分词器       从第一部分内容可以看出:Analyzer(分析器)由Tokenizer(分词器)和Filter(过滤器)组成。       1、ES内置分析器              
standard analyzerstandardstandard tokenizer, standard filter, lower case filter, stop filter
simple analyzersimplelower case tokenizer
stop analyzerstoplower case tokenizer, stop filter
keyword analyzerkeyword不分词,内容整体作为一个token(not_analyzed)
pattern analyzerwhitespace正则表达式分词,默认匹配\W+
language analyzerslang各种语言
snowball analyzersnowballstandard tokenizer, standard filter, lower case filter, stop filter, snowball filter
custom analyzercustom一个Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter
        2、ES内置分词器
standard tokenizerstandard 
edge ngram tokenizeredgeNGram 
keyword tokenizerkeyword不分词
letter analyzerletter按单词分
lowercase analyzerlowercaseletter tokenizer, lower case filter
ngram analyzersnGram 
whitespace analyzerwhitespace以空格为分隔符拆分
pattern analyzerpattern定义分隔符的正则表达式
uax email url analyzeruax_url_email不拆分url和email
path hierarchy analyzerpath_hierarchy处理类似
/path/to/somthing
样式的字符串
        3、ES内置过滤器        (1)ES内置的token filter
standard filterstandard 
ascii folding filterasciifolding 
length filterlength去掉太长或者太短的
lowercase filterlowercase转成小写
ngram filternGram 
edge ngram filteredgeNGram 
porter stem filterporterStem波特词干算法
shingle filtershingle定义分隔符的正则表达式
stop filterstop移除 stop words
word delimiter filterword_delimiter将一个单词再拆成子分词
stemmer token filterstemmer 
stemmer override filterstemmer_override 
keyword marker filterkeyword_marker 
keyword repeat filterkeyword_repeat 
kstem filterkstem 
snowball filtersnowball 
phonetic filterphonetic插件
synonym filtersynonyms处理同义词
compound word filterdictionary_decompounder, hyphenation_decompounder分解复合词
reverse filterreverse反转字符串
elision filterelision去掉缩略语
truncate filtertruncate截断字符串
unique filterunique 
pattern capture filterpattern_capture 
pattern replace filtepattern_replace用正则表达式替换
trim filtertrim去掉空格
limit token count filterlimit限制token数量
hunspell filterhunspell拼写检查
common grams filtercommon_grams 
normalization filterarabic_normalization, persian_normalization 
         (2)ES内置的character filter   
mapping char filtermapping根据配置的映射关系替换字符
html strip char filterhtml_strip去掉HTML元素
pattern replace char filterpattern_replace用正则表达式处理字符串
         4、自定义分析器       ES允许用户通过配置文件elasticsearch.yml自定义分析器Analyzer,如下:       index:              analysis:                     analyzer:                            myAnalyzer:                                   tokenizer: standard                                  filter: [standard, lowercase, stop]       上面配置信息注册了一个分析器myAnalyzer,在次注册了之后可以在索引或者查询的时候直接使用。该分析器的功能和标准分析器差不多,tokenizer: standard,使用了标准分词器 ;filter: [standard, lowercase, stop],使用了标准过滤器、转小写过滤器和停用词过滤器。        也可以使用第三方分析器,比如IKAnalyzer,详情请参考ElasticSearch安装ik分词插件 http://my.oschina.net/xiaohui249/blog/260993
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐