在全文搜索中我们常常会在多个字段中匹配同一个查询条件或者在不同的字段中匹配不同的条件。比如下面这个例子:

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:多字段全文搜索的更多相关文章

  1. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...

  2. 可以执行全文搜索的原因 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 ...

  3. eclipse安装quick text search插件,全文搜索

    主要有两种方法 1.InstaSearch 同样可以做到workspace下的全文搜索 可以使用eclipse marktplace中搜索instaSearch,与普通软件安装类似 安装成功后的界面如 ...

  4. SQLSERVER全文搜索

    SQLSERVER全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语句 ...

  5. OSChina 的全文搜索设计说明 —— 索引过程

    http://www.oschina.net/question/12_71591 言: OSChina 的搜索做得并不好,很久之前一直想在细节方面进行改造,一直也没什么好的思路.但作为整体的结构或许对 ...

  6. 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索

    实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...

  7. php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

    转载自:http://blog.csdn.net/nuli888/article/details/51892776 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图 ...

  8. 使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能

    最近用了几天时间为公司项目集成了全文搜索引擎,项目初步目标是用于搜索框的即时提示.数据需要从MySQL中同步过来,因为数据不小,因此需要考虑初次同步后进行持续的增量同步.这里用到的开源服务就是Elas ...

  9. C# 全文搜索Lucene

    全文出自:https://blog.csdn.net/huangwenhua5000/article/details/9341751 1 lucene简介1.1 什么是luceneLucene是一个全 ...

随机推荐

  1. ES6构造函数class 和 ES5构造函数语法

    构造函数就是JavaScript程序定义好的函数,我们直接使用就可以,实际也是一种函数,构造函数专门用于生成定义对象,通过构造函数生成的对象,称为实例化对象 构造函数分为两种,一种是JavaScrip ...

  2. 搞懂 XML 解析,徒手造 WEB 框架

    恕我斗胆直言,对开源的 WEB 框架了解多少,有没有尝试写过框架呢?XML 的解析方式有哪些?能答出来吗?! 心中没有答案也没关系,因为通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a ...

  3. redis: 主从复制和哨兵模式(十三)

    redis 主从复制 最低要求是一主二从(一个主机和两个从机) 主机才能写 从机只能读 只要从机连接到主机 数据就会全量复制到从机 环境配置(同一台机器) 1:配置文件 redis.conf配置如下: ...

  4. linux内核第一宏 container_of

    内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析 ...

  5. B站百大UP主党妹被黑客勒索!!!

    4月27日,哔哩哔哩视频网站的UP主“机智的党妹”发布消息称,自己被黑客勒索了.她的视频表示:“事发突然,我被勒索了,你也有可能继续被诈骗!这种诈骗的页面是由病毒程序自动生成并留在那里的.”根据她的介 ...

  6. 调用ocx ActiveX控件详解(做一个简单的ocx控件)

    背景 最近做的项目都和插件有关,就是在页面中调用插件的方法,然后进行操作. 插件就是ocx ActiveX控件,具体的说明可以自己去了解一下,在这里就不做赘述. 具体调用方式很简单: 1.在页面中写一 ...

  7. 0day笔记(1)PE文件格式与虚拟文件内存的映射

    PE文件格式 PE 文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中. 一个典型的 PE 文件中包含的节如下: .text 存放着二进制的机器代码 .data 初始 ...

  8. tp5--相对路径和绝对路径

    首先,我们要先明白相对路径和绝对路径的理论: 绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\window ...

  9. thinkphp5.0 配置文件加载路径说明

    在thinphp5.0框架里,js,css等配置文件都是加载在/public/static的目录下,所以要引用这些文件,路径必须是要写好的,代码如图: return [ // 默认模块名 'defau ...

  10. 2019-2020-1 20199308《Linux内核原理与分析》第四周作业

    <Linux内核分析> 第三章 MenuOS的构造 3.1 Linux内核源代码简介 操作系统的"两把宝剑" 中断上下文:保存现场和恢复现场 进程上下文 目录结构 ar ...