elasticsearch笔记_全文搜索_query(五)
来源:互联网 发布:国产入门耳机推荐 知乎 编辑:程序博客网 时间:2024/04/30 05:40
全文搜索(Query)
全文搜索最重要的两个方面就是”相关性(Relevance)”和”分析(Analysis)” .
相关性(Relevance)
每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。_score 评分越高 , 相关性就越高 。
检索词频率TF(Token Frequency):检索词出现的频率,出现频率越多,相关性越高.(例如:检索词出现5次比出现1次的的相关性要高.)
反向文档频率IDF(Inverse Document Frequency):每个词在索引(名词)中出现的频率,频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
字段长度准则:字段的长度.长度越长,相关性越低。检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。
注意 : 相关性的概念并不只用于全文搜索,也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。
关于TF/IDF的解释:
有很多不同的数学公式可以用来计算TF-IDF。这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (IDF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
主要是为了去掉无用词条,例如汉语里面的”的”,”是”等无用词.
分析(Analysis)
它是将文本块转换为有区别的、规范化的 token 的一个过程 . 详细 : elasticsearch笔记_映射,分析器(三)
match查询(单个词搜索)
match查询最强大 , 既能处理全文字段 , 又能处理精确字段 .
例1 : 搜索关键字是一个单个字.GET /my_index/my_type/_search{ "query": { "match": { "title": "QUICK!" } }}
查询步骤 :
1.检查字段类型 : 标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。2.分析查询字符串 : 将查询的字符串 QUICK! 传入标准分析器中,输出的结果是单个项 quick 。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。
3.查找匹配文档 :用 term 查询在倒排索引中查找 quick 然后获取一组包含该项的文档.
4.为每个文档评分 (根据相关性的判断)。
match搜索(多词搜索)
例2:搜索关键字是一组单词.GET /my_index/my_type/_search{ "query": { "match": { "title": "BROWN DOG!" } }}
查询步骤 : 将多个关键字进行拆分 , 它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中.
精确度控制
在上面的搜索里面,只要包含两个关键字的任意一个的文档就被认为是符合要求的 . 换句话说匹配的是 brown OR dog ,如果希望匹配 brown AND dog 去检索文档,可以控制match里面的operator参数 .
GET /my_index/my_type/_search{ "query": { "match": { "title": { "query": "BROWN DOG!", "operator": "and" } } }}
如果关键词是4个,想要匹配3个,这种情况可以使用minimum_should_match参数,配置参数为75%:
GET /my_index/my_type/_search{ "query": { "match": { "title": { "query": "quick brown dog", "minimum_should_match": "75%" } } }}
如果关键字是3个,还写了75%,会被默认为66.6%.
组合查询(bool查询)的评分标准和精确度控制
评分标准 :
bool过滤的must 、 must_not 和 should在bool查询这里一样可以用,不过bool查询除了决定一个文档是否应该被包括在结果中,还会计算文档的 相关程度 。
GET /my_index/my_type/_search{ "query": { "bool": { "must": { "match": { "title": "quick" }}, "must_not": { "match": { "title": "lazy" }}, "should": [ { "match": { "title": "brown" }}, { "match": { "title": "dog" }} ] } }}
bool 查询会为每个文档计算相关度评分 _score , 再将所有匹配的 must 和 should 语句的分数 _score 求和,最后除以 must 和 should 语句的总数。must_not 语句不会影响评分; 它的作用只是将不相关的文档排除。
精确度控制 : 与match 查询的精度控制一样,我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量, 它既可以是一个绝对的数字,又可以是个百分比
GET /my_index/my_type/_search{ "query": { "bool": { "should": [ { "match": { "title": "brown" }}, { "match": { "title": "fox" }}, { "match": { "title": "dog" }} ], "minimum_should_match": 2 //得有两个should满足条件才算匹配. } }}
注意 : 其实多词 match 查询只是简单地将生成的 term 查询包裹 在一个 bool 查询中。如果使用默认的 or 操作符,每个 term 查询都被当作 should 语句,这样就要求必须至少匹配一条语句。
以下两个是等价的:
{ "match": { "title": "brown fox"}}{ "bool": { "should": [ { "term": { "title": "brown" }}, { "term": { "title": "fox" }} ] }}
以下两个是等价的:
{ "match": { "title": { "query": "brown fox", "operator": "and" } }}{ "bool": { "must": [ { "term": { "title": "brown" }}, { "term": { "title": "fox" }} ] }}
以下两个是等价的:
{ "match": { "title": { "query": "quick brown fox", "minimum_should_match": "75%" } }}{ "bool": { "should": [ { "term": { "title": "brown" }}, { "term": { "title": "fox" }}, { "term": { "title": "quick" }} ], "minimum_should_match": 2 }}
权重的提升
可以通过指定 boost 来控制任何查询语句的相对的权重,boost 的默认值为 1 ,大于 1 会提升一个语句的相对权重。举例 :
GET /_search{ "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ] } }}
上面的例子里面 must语句默认使用的boost值是1 , 关键字 Lucene的boost值设为2 , 使Lucene变得更重要 . Elasticsearch的boost值设为3 ,说明它比Lucene更重要 . 更高的 boost 值为我们带来更高的评分 _score .
注意:boost的值并不一定是线性的,意思就是boost的值设置为2不一定就是boost值为1的两倍 .
关于分析器的说明:
1 . match 查询为每个字段使用合适的分析器,以保证它在寻找每个项时都为该字段使用正确的格式。
2 . 分析器可以从三个层面进行定义:按字段(per-field)、按索引(per-index)或全局缺省(global default)。
3 . Elasticsearch在索引(动词)时会按照以下顺序依次找到能够使用的分析器 :
(1) 字段映射里定义的 analyzer .
(2) 索引设置中名为 default 的分析器.
(3) standard 标准分析器.
4 . Elasticsearch在搜索时会按照以下顺序依次找到能够使用的分析器 :
(1) 查询自己定义的 analyzer ,否则
(2) 字段映射里定义的 search_analyzer ,否则
(3) 字段映射里定义的 analyzer ,否则
(4) 索引设置中名为 default_search 的分析器,默认为
(5) 索引设置中名为 default 的分析器,默认为
(6) standard 标准分析器
- elasticsearch笔记_全文搜索_query(五)
- 全文搜索之 Elasticsearch
- [Elasticsearch] 全文搜索
- [Elasticsearch] 全文搜索
- 全文搜索之 Elasticsearch
- [Elasticsearch] 全文搜索 (三)
- elasticsearch全文搜索
- elasticsearch笔记_多字段搜索(六)
- ElasticSearch(五)-搜索
- elasticsearch笔记_精确值搜索_filter(四)
- MySQL 全文搜索笔记
- 全文搜索-介绍-elasticsearch-definitive-guide翻译
- Elasticsearch(10)实践六-全文搜索
- ES 深入搜索02_全文搜索
- Elasticsearch(五)elasticsearch高亮搜索
- Spring Data Elasticsearch加Elasticsearch服务实现全文搜索
- ElasticSearch(五)--搜索Search
- Elasticsearch服务器 搜索笔记
- pbf文件转换为osm
- spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
- 二叉树前序遍历
- 自定义 Behavior
- PLSQL 11 注册码
- elasticsearch笔记_全文搜索_query(五)
- 修改商品时图片的增加与删除
- 欢迎使用CSDN-markdown编辑器
- KMP字符串模式匹配算法Java实现
- 二叉树实现及递归遍历
- qt之键盘、鼠标事件处理
- 华为OJ训练之0038-170114-自守数
- ios
- Codeforces609D Gadgets for dollars and pounds(二分+贪心)