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内置分析器
2、ES内置分词器
3、ES内置过滤器 (1)ES内置的token filter
(2)ES内置的character filter
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
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 analyzer | standard | standard tokenizer, standard filter, lower case filter, stop filter |
simple analyzer | simple | lower case tokenizer |
stop analyzer | stop | lower case tokenizer, stop filter |
keyword analyzer | keyword | 不分词,内容整体作为一个token(not_analyzed) |
pattern analyzer | whitespace | 正则表达式分词,默认匹配\W+ |
language analyzers | lang | 各种语言 |
snowball analyzer | snowball | standard tokenizer, standard filter, lower case filter, stop filter, snowball filter |
custom analyzer | custom | 一个Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter |
standard tokenizer | standard | |
edge ngram tokenizer | edgeNGram | |
keyword tokenizer | keyword | 不分词 |
letter analyzer | letter | 按单词分 |
lowercase analyzer | lowercase | letter tokenizer, lower case filter |
ngram analyzers | nGram | |
whitespace analyzer | whitespace | 以空格为分隔符拆分 |
pattern analyzer | pattern | 定义分隔符的正则表达式 |
uax email url analyzer | uax_url_email | 不拆分url和email |
path hierarchy analyzer | path_hierarchy | 处理类似/path/to/somthing样式的字符串 |
standard filter | standard | |
ascii folding filter | asciifolding | |
length filter | length | 去掉太长或者太短的 |
lowercase filter | lowercase | 转成小写 |
ngram filter | nGram | |
edge ngram filter | edgeNGram | |
porter stem filter | porterStem | 波特词干算法 |
shingle filter | shingle | 定义分隔符的正则表达式 |
stop filter | stop | 移除 stop words |
word delimiter filter | word_delimiter | 将一个单词再拆成子分词 |
stemmer token filter | stemmer | |
stemmer override filter | stemmer_override | |
keyword marker filter | keyword_marker | |
keyword repeat filter | keyword_repeat | |
kstem filter | kstem | |
snowball filter | snowball | |
phonetic filter | phonetic | 插件 |
synonym filter | synonyms | 处理同义词 |
compound word filter | dictionary_decompounder, hyphenation_decompounder | 分解复合词 |
reverse filter | reverse | 反转字符串 |
elision filter | elision | 去掉缩略语 |
truncate filter | truncate | 截断字符串 |
unique filter | unique | |
pattern capture filter | pattern_capture | |
pattern replace filte | pattern_replace | 用正则表达式替换 |
trim filter | trim | 去掉空格 |
limit token count filter | limit | 限制token数量 |
hunspell filter | hunspell | 拼写检查 |
common grams filter | common_grams | |
normalization filter | arabic_normalization, persian_normalization |
mapping char filter | mapping | 根据配置的映射关系替换字符 |
html strip char filter | html_strip | 去掉HTML元素 |
pattern replace char filter | pattern_replace | 用正则表达式处理字符串 |
相关文章推荐
- es核心知识篇学习之Elasticsearch 06 ---elasticsearch有六种搜索方式
- elasticsearch核心知识--34.搜索引擎_分析器的内部组成到底是什么,以及内置分词器的介绍
- elasticsearch核心知识--46.scroll技术滚动搜索大量数据以及和FromSize分页的本质区别和性能
- elasticsearch核心知识--15.document id的手动指定与自动生成两种方式解析
- elasticsearch核心知识--29._multi-index&multi-type搜索模式解析以及搜索原理
- elasticsearch核心知识--30.分页搜索以及deep paging性能问题深度理解和es中聚合aggregation的分组可能结果不准确的原因
- elasticsearch核心知识--42.多搜索条件组合查询,sort以及explain的用法
- elasticsearch核心知识--45.搜索相关参数以及bouncing results问题解决方案
- elasticsearch核心知识---50.定制化自己的dynamic mapping策略
- lucene多种搜索方式详解例子
- lucene多种搜索方式详解例子
- elasticsearch核心知识--20.图解partial update实现原理以及retry_on_conflict
- elasticsearch核心知识--26.一致性原理以及quorum机制理解
- adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式
- ElasticSearch搜索方式
- elasticsearch核心知识--9.shard&replica机制再次梳理以及单node环境中创建index图解
- elasticsearch核心知识--13.图解Elasticsearch容错机制:master选举,replica容错,数据恢复
- elasticsearch核心知识--28._search结果解析(search timeout机制)
- elasticsearch核心知识--32.elasticsearch中的mapping是什么和_mapping的核心数据类型以及dynamic mapping
- elasticsearch核心知识--39.filter与query对比:相关度,性能