Elasticsearch 单字符串多字段查询
前言
有些时候,我们搜索的时候,只会提供一个输入框,但是会查询相关的多个字段,典型的如Google搜索,我们该如何用 Elasticsearch 如何实现呢?
实例
从单字符串查询的实例说起
创建测试例子的数据
DELETE blogs
PUT blogs/_doc/_bulk
{"index":{"_id":1}}
{"title": "Quick brown rabbits","body": "Brown rabbits are commonly seen."}
{"index":{"_id":2}}
{"title": "Keeping pets healthy","body": "My quick brown fox eats rabbits on a regular basis"}
GET blogs/_search
{
"explain": true,
"query": {
"bool": {
"should": [
{"match": {"title": "Brown fox"}},
{"match": {"body": "Brown fox"}}
]
}
}
}
上面的例子相关性的值是title与body的简单相加,可以通过“"explain": true”打印出来的数据进行查询计算的过程。
最优字段查询调优
可以使用disjunction max query,让其匹配最大相关性那个字段,同时tie_breaker可以调整相关性,取值范围是0~1,可以控制相关性较小那个值占用的比例,默认是0,毕竟只要相关性最大那个字段就好了,其他字段不打分。
GET blogs/_search
{
"explain": true,
"query": {
"dis_max": {
"queries": [
{"match": {"title": "Brown fox"}},
{"match": {"body": "Brown fox"}}
],
"tie_breaker": 0.7
}
}
}
相关性的值是title与body中的最大值。
multi_match
multi_match 查询为能在多个字段上反复执行相同查询提供了一种便捷方式。
上面的dis_max例子改写如下
GET blogs/_search
{
"explain": true,
"query": {
"multi_match": {
"type": "most_fields",
"query": "Brown fox",
"fields": ["title","body"],
"tie_breaker": 0.7
}
}
}
multi_match 查询
multi_match 支持三种场景
- best_fields——(默认)查找匹配任何字段的文档,但是使用最佳匹配字段的_score。
- most_fields——查找匹配任何字段的文档,结合每个字段的_score。
- cross_fields——用相同的分析器处理字段,把这些字段当作一个大字段。查找任何字段的每个单词。类似copy_to
query中可以指定minimum_should_match、operator等字段,会把这些字段传递到query语句中
best_fields
当搜索词语具体概念的时候,比如 “brown fox” ,词组比各自独立的单词更有意义。像 title 和 body 这样的字段,尽管它们之间是相关的,但同时又彼此相互竞争。文档在相同字段 中包含的词越多越好,评分也来自于最匹配字段 。
best_fields 语句 等同于 dis_max 语句,可以配置tie_breaker参数。
most_fields
全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档; 精确率 ——不返回无关文档。目的是在结果的第一页中为用户呈现最为相关的文档。
为了提高召回率的效果,我们扩大搜索范围——不仅返回与用户搜索词精确匹配的文档,还会返回我们认为与查询相关的所有文档。如果一个用户搜索 “quick brown box” ,一个包含词语“fast foxes”的文档被认为是非常合理的返回结果。
提高全文相关性精度的常用方式是为同一文本建立多种方式的索引,每种方式都提供了一个不同的相关度信号signal。主字段会以尽可能多的形式的去匹配尽可能多的文档。
DELETE titles
PUT titles
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "english",
"fields": {"std": {"type": "text","analyzer": "standard"}}
}
}
}
}
GET /titles/_search
{
"query": {
"multi_match": {
"query": "barking dogs",
"type": "most_fields",
"fields": [ "title^10", "title.std" ]
}
}
}
比如这个例子,文档中的“title”被索引了两次,主字段“title”的分词器是“english”,会提取词干,“a”,“the”等这些会在分词过程中被过滤掉,“ing”等会去除,子字段“title.std”的分词器是“standard”,不会提取词干。
同时指定了boost,比如上面的“title^10”,表示“title”的权重是10。
cross_fields
对于某些实体,我们需要在多个字段中确定其信息,单个字段都只能作为整体的一部分:
Person: first_name 和 last_name (人:名和姓)
Book: title 、 author 和 description (书:标题、作者、描述)
Address: street 、 city 、 country 和 postcode (地址:街道、市、国家和邮政编码)
在这种情况下,我们希望在任何 这些列出的字段中找到尽可能多的词,这有如在一个大字段中进行搜索,这个大字段包括了所有列出的字段。
这个类似copy_to,copy_to需要额外的存储空间,这个不需要。
支持 operator 操作,如果指定的是“and”,那么表示所有词都是必须的。
参考资料
Elasticsearch 单字符串多字段查询的更多相关文章
- ElasticStack学习(十):深入ElasticSearch搜索之QueryFiltering、多/单字符串的多字段查询
一.复合查询 1.在ElasticSearch中,有Query和Filter两种不同的Context.Query Context进行了相关性算分,Filter Context不需要进行算分,同时可以利 ...
- ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...
- ElasticSearch多个字段分词查询高亮显示
ElasticSearch关键字查询,将关键字分词后查询,多个字段,查询出来字段高亮显示. 查询方法如下: public List<NewsInfo> searcher2(String k ...
- [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优
最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...
- [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优(转)
最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...
- ElasticSearch第四步-查询详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
- Elasticsearch Span Query跨度查询
ES基于Lucene开发,因此也继承了Lucene的一些多样化的查询,比如本篇说的Span Query跨度查询,就是基于Lucene中的SpanTermQuery以及其他的Query封装出的DSL,接 ...
- ElasticSearch(6)-结构化查询
引用:ElasticSearch权威指南 一.请求体查询 请求体查询 简单查询语句(lite)是一种有效的命令行_adhoc_查询.但是,如果你想要善用搜索,你必须使用请求体查询(request bo ...
- Elasticsearch java api 常用查询方法QueryBuilder构造举例
转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...
随机推荐
- apache 解析漏洞(CVE-2017-15715)
在p牛博客最近更新的文章,传送门,感觉很有意思,自己在自己本地测试了一下 0x01 正则表达式中的 '$' apache这次解析漏洞的根本原因就是这个 $,正则表达式中,我们都知道$用来匹配字符串结尾 ...
- unity编辑器扩展学习
扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...
- Apple iOS 触控按钮 自动关闭 bug
Apple iOS 触控按钮 自动关闭 bug bug 轻点 iPhone 背面可执行操作 您可以轻点两下或轻点三下 iPhone 背面以执行某些操作,如向上或向下滚动.截屏.打开"控制中心 ...
- npm fetch All In One
npm fetch All In One fetch for TypeScript { "compilerOptions": { "lib": ["D ...
- chown -R & chmod 777 & chmod +x
chown -R & chmod 777 & chmod +x https://linux.die.net/man/1/chown chown - change file owner ...
- Base 64 & URL & blob & FileReader & createObjectURL
Base 64 & URL & blob & FileReader & createObjectURL /** * let blob = item.getAsFile( ...
- Node.js & module.exports & exports
Node.js & module.exports & exports https://www.cnblogs.com/xgqfrms/p/9493550.html exports &a ...
- vue2.0用法以及环境配置
一.配置环境搭建 1.安装node.js (可以去官网看) 2.安装git (推荐看廖雪峰文章,点击查看) 3.安装vue: cmd:npm install vue //最新稳定版本 npm inst ...
- MySQL全面瓦解22:索引的介绍和原理分析
索引的定义 MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构. 本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时 ...
- CSS前端性能优化
1.Google 资深web开发工程师Steve Souders对CSS选择器的效率从高到低做了一个排序: 1. id选择器(#myid) 2. 类选择器(.myclassname) 3. 标签选择器 ...