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是一个全 ...
随机推荐
- 【Tool】IDEA 连接数据库
窗口 View - DataBase 右侧的窗口弹出,点加号选择数据库 没有装载驱动包,提示下载 可以选择老版本的驱动,或者新版的 老版本驱动只需要填入数据库,账户和密码即可测试链接,显示连接成功 新 ...
- linux下DNS服务器搭建,正反向解析配置
dns服务器之前自己搭建玩过,一段时间不搞,加上当时没写文档,基本忘光光了,这次老实了,写个文档记下来,方便以后查阅. 1.服务器准备 为了避免不必要的问题,关闭防火墙,关闭selinux,hosts ...
- 用python从0到1制作动态条形图的过程
大家好,今天我们要讲的是如何使用Pyecharts制作动态排名变化图
- 6. webRTC
webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B. 1.) A 方 <!DOCTYPE html> <html id=" ...
- ISWC 2018概览:知识图谱与机器学习
语义网的愿景活跃且良好,广泛应用于行业 语义网的愿景是「对计算机有意义」的数据网络(正如 Tim Berners Lee.James Hendler 和 Ora Lassila 在<科学美国人& ...
- node 搭载本地代理,处理web本地开发跨域问题
var path = require('path') var httpProxy = require('http-proxy') var express = require('express') va ...
- linux 批量删除文件
来源;https://www.cnblogs.com/sinpo/p/7106998.html linux下批量删除文件 1. 在linux批量删除多级目录下同一格式的文件,可采用find + e ...
- ajax轮询思路
以我个人理解 ,ajax短轮询就是用定时器,定时请求数据库,然后把有用的数据做处理 ajax长轮询恩 就是在 ajax回调函数,继续调用ajax请求
- (第五篇)Linux操作系统基本结构介绍
Linux操作系统基本结构介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用 ...
- 吕建文 20199303《Linux内核原理与分析》第十二周作业
ShellShock攻击实验 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞 ...