search(10)- elastic4s-multi_match:多字段全文搜索
在全文搜索中我们常常会在多个字段中匹配同一个查询条件或者在不同的字段中匹配不同的条件。比如下面这个例子:
GET /books/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "和平战争" }},
{ "match": { "author": "托斯泰" }}
]
}
}
}
我们可以用boolQuery来进行查询语句的组合。全文搜索会产生匹配度评分。boolQuery采取的评分策略是:符合条件的语句越多,评分就越高。如果查询结果按评分倒排序的话,那么排在最前面的就是最有可能的结果了。boolQuery可以包含boolQuery,如下:
GET /books/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "和平战争" }},
{ "match": { "author": "托斯泰" }},
"bool" : {
"should" : [
{"match" : { "translator" : "陈"}},
{"match" : { "translator" : "王"}}
]
}
]
}
}
}
增加条件的意思是:如果翻译者姓陈或姓王,那么评分就高点。不过把boolQuery嵌入另一个boolQuery会影响外部boolQuery的评分结果。因为嵌入的boolQuery只占总评分的三分之一。当然可以通过boost来平衡比重,如下:
GET /books/_search
{
"query": {
"bool": {
"should": [
{ "match":
{
"title": {
"query": "和平战争",
"boost":
}
}
},
{ "match": { "author": "托斯泰" }},
"bool" : {
"should" : [
{"match" : { "translator" : "陈"}},
{"match" : { "translator" : "王"}}
]
}
]
}
}
}
从上面的例子里可以看到:boolQuery是典型的多字段多条件匹配查询,用户必须明确分辨那些条件在那些字段里匹配。但人们习惯于一句话里表达多个字段的条件。或者他们根本不想分辨任何字段,期望一句话就得到想要的结果。这个时候boolQuery就不太适合使用了。
首先,我们可以尝试在多个字段中匹配同样一个综合语句如:和平战争托斯泰。这时我们可能面临3种选择:
1、best-fields:同样一个条件在不同的字段里匹配产生多个评分,整体查询只取最优评分
2、most-fields: 这个方法有点复杂,需要在建索引时把一个字段按分词方式分成多个字段,查询时取满足条件最多字段的评分
3、cross-fields:把所有涉及的字段合成一个大字段,然后用条件来匹配这个组合而成的字段。这个方法应该最适合我们的要求
我们先分析一下具体场景:一个人想在网站上找一本书,应该会从书名、作者、出版社这几个方面提供查询条件(虽然是在一个输入框输入条件),也就是说用户提供的一个查询条件里可能包含了书名、作者、出版社这几方面的信息。那么第一个版本的搜索请求如下:
GET /books/_search
{
"query": {
"multi_match": {
"query": "和平与战争 托斯泰 人民出版社",
"type": "cross_fields",
"fields": ["title","author","publisher"]
}
}
}
按理来讲书名的比重应该高于作者,出版社,所以应该为title加比重:
GET /books/_search
{
"query": {
"multi_match": {
"query": "和平与战争 托斯泰 人民出版社",
"type": "cross_fields",
"fields": ["title^2","author","publisher"]
}
}
}
为了更精确的筛选,词句terms应该采取and进行关联:
GET /books/_search
{
"query": {
"multi_match": {
"query": "和平与战争 托斯泰 人民出版社",
"type": "cross_fields",
"fields": ["title","author","publisher"],
"operator": "and"
}
}
}
得出的结果集会大大缩短。用户可以取消一些条件来增加结果范围。做的再仔细点我们还可以在图书的内容上面做点功夫:
GET /books/_search
{
"query": {
"multi_match": {
"query": "和平与战争 托斯泰 人民出版社",
"type": "cross_fields",
"fields": ["title^3","author^2","publisher^2","toc","intro"],
"operator": "and"
}
}
}
增加了目录toc, 内容简介intro。不过它们的比重是最低的。
elastic4示例如下:
val qMultiMatch = search("books").query(
multiMatchQuery("和平与战争 托斯泰 人民出版社")
.matchType("cross_fields")
.operator("and")
.fields(
"title^3",
"author^2",
"publisher^2",
"toc",
"intro"
)
).sourceInclude("ISBN","title","publisher","price","author")
search(10)- elastic4s-multi_match:多字段全文搜索的更多相关文章
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...
- 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询
https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...
- eclipse安装quick text search插件,全文搜索
主要有两种方法 1.InstaSearch 同样可以做到workspace下的全文搜索 可以使用eclipse marktplace中搜索instaSearch,与普通软件安装类似 安装成功后的界面如 ...
- SQLSERVER全文搜索
SQLSERVER全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语句 ...
- OSChina 的全文搜索设计说明 —— 索引过程
http://www.oschina.net/question/12_71591 言: OSChina 的搜索做得并不好,很久之前一直想在细节方面进行改造,一直也没什么好的思路.但作为整体的结构或许对 ...
- 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索
实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...
- php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
转载自:http://blog.csdn.net/nuli888/article/details/51892776 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图 ...
- 使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能
最近用了几天时间为公司项目集成了全文搜索引擎,项目初步目标是用于搜索框的即时提示.数据需要从MySQL中同步过来,因为数据不小,因此需要考虑初次同步后进行持续的增量同步.这里用到的开源服务就是Elas ...
- C# 全文搜索Lucene
全文出自:https://blog.csdn.net/huangwenhua5000/article/details/9341751 1 lucene简介1.1 什么是luceneLucene是一个全 ...
随机推荐
- 做一个通过dockerfile从零构建centos7.4
今天做一个dockerfile从零构建centos7.4镜像 废话不多说,很简单. 需要的软件包:centos7.4的rootfs 链接:提取码:usnu 下载以后我们打开看看里面是什么呢: 可以看的 ...
- Redis之ziplist源码分析
一.ziplist简介 从上一篇分析我们知道quicklist的底层存储使用了ziplist(压缩列表),由于压缩列表本身也有不少内容,所以重新开了一篇,在正式源码之前,还是先看下ziplist的特点 ...
- 高德APP启动耗时剖析与优化实践(iOS篇)
前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为用户省下的时间,还 ...
- 计算机视觉中的对象检测,Python用几段代码就能实现
目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...
- Daily Scrum 12/23/2015
Process: Zhaoyang: Compile the Caffe IOS version and make it run in the IOS9. Yandong: Finish the Az ...
- 3. pkg
程序打包成可执行文件(.exe) 1.) npm install -g pkg 2.) 单个文件:pkg entrance.js ( windows: pkg -t win entrance.js ...
- C#集合ArrayList、泛型集合List(3)
数组的制约:局限性.有多少放多少,要想追加,就必须重新再定义一个数组,这就造成了资源的极大浪费而且性能消耗也比较大.因此此操作不太推荐.所以集合就来了. ,,,} 创建集合: ArrayList li ...
- 2019-2020-1 20199308《Linux内核原理与分析》第三周作业
<Linux内核分析> 第二章 操作系统是如何工作的 2.1 函数调用堆栈 3个关键性的方法机制(3个法宝) 存储程序计算机 函数调用堆栈机制 中断 堆栈相关的寄存器 ESP:堆栈指针(s ...
- 15个有趣好玩的linux shell 命令
今天介绍一些有趣的linux shell命令,所有的命令都可以使用man + 命令名称 来查看完整的使用方法. 1,figlet 字符画 figlet 可以将英文字符串以字符画的形式输出: >& ...
- BIOS和CMOS区别
在网上看到一篇关于CMOS的文章,分享一下. 原文地址:http://jingyan.baidu.com/article/c843ea0b51155d77921e4a7a.html BIOS是什么? ...