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是一个全 ...
随机推荐
- Win10安装Keras+Tensorflow+Opencv
Win10安装keras 安装 Anaconda 清华加速下载链接: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我选择的版本是: A ...
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- 牛客练习赛61 相似的子串(二分+Hash)
题面在此 题解:将字符串分成k部分,然后求最长前缀,所以我们只关注前缀部分就好了,公共前缀后边的是啥不用管,那么问题就转化成了是否存在k个不相交的字符串的最长公共前缀问题.首先用Hash来记录一下字符 ...
- powershell提示无法将“”项识别
解决: 完成! 解释: 权限问题.Powershell脚本的4种执行权限介绍,Windows默认不允许任何脚本运行,我们可以使用"Set-ExecutionPolicy"cmdle ...
- BUU刷题01
[安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...
- jmeter并发时生成唯一变量
vars.put("partnerOrderId","ZS"+Thread.currentThread().getId()+System.currentTime ...
- mongoDB(一)——mongoDB安装部署和常用shell命令
1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...
- anaconda 使用conda命令创建虚拟环境
1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)conda list 查看安装了哪些包. 2)con ...
- SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...
- SQL三表连接查询与集合的并、交、差运算查询
use db_sqlserver2 select 姓名, 工资, 面积, 金额, (工资+金额/1000) as 实发工资 from 职工,仓库, 订购单 where 职工.职工号=订购单.职工号 a ...