Elasticsearch用例:全文搜索

在本系列有关Elasticsearch用例的最后一篇文章中,我们介绍了Elasticsearch提供的用于存储甚至大量文档的功能 。 在这篇文章中,我们将研究其另一个核心功能:搜索。 我正在利用上一篇文章中的某些信息,因此,如果您还没有阅读过,则应该立即阅读。

如我们所见,我们可以使用Elasticsearch存储甚至可以分布在多台机器上的JSON文档。 索引用于对文档进行分组,并且每个文档都使用某种类型存储。 分片用于在多个节点之间分配索引的一部分,副本是分片的副本,用于分配负载和容错。

全文搜索

每个人都使用全文搜索。 仅通过导航和类别就无法访问大量信息。 Google是提供大量信息即时关键词搜索的最杰出的例子。

谷歌

查看Google的功能,我们已经可以看到全文搜索的一些常见功能。 用户仅提供关键字,并期望搜索引擎提供良​​好的结果。 预计文档的相关性很好,并且用户希望在第一页上获得所需的结果。 文档的相关性可能受不同因素的影响,例如查询的术语存在于文档中。 除了获得最佳结果外,用户还希望在搜索过程中得到支持。 建议和结果摘录中的突出显示等功能可以帮助实现这一目标。

搜索非常重要的另一个领域是电子商务,其中亚马逊是主要参与者。

亚马逊

该界面看起来类似于Google的界面。 用户可以输入然后搜索的关键字。 但是也有细微的差异。 亚马逊提供的建议更为高级,还暗示可能在其中找到术语的类别。结果显示也有所不同,包括结构化的视图。 所搜索文档的结构还用于确定左侧的构面,这些构面可用于基于某些条件过滤当前结果,例如,所有结果的成本在10到20欧元之间。 最后,当涉及到诸如在线商店之类的内容时,相关性可能意味着完全不同的东西。 通常,结果清单的顺序会受到供应商的影响,或者用户可以按价格或发布日期等标准对结果进行排序。

尽管Google和Amazon均未使用Elasticsearch,但您可以使用它来构建类似的解决方案。

在Elasticsearch中搜索

与其他所有内容一样,可以使用HTTP搜索Elasticsearch。 在最简单的情况下,可以将_search端点附加到URL并添加一个参数 : curl -XGET "http://localhost:9200/conferences/talk/_search?q=elasticsearch⪯tty=true" 。 然后,Elasticsearch将按照相关性对结果进行响应。

{"took" : 81,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.067124054,"hits" : [ {"_index" : "conferences","_type" : "talk","_id" : "iqxb7rDoTj64aiJg55KEvA","_score" : 0.067124054,"_source":{"title" : "Anwendungsfälle für Elasticsearch","speaker" : "Florian Hopf","date" : "2014-07-17T15:35:00.000Z","tags" : ["Java", "Lucene"],                                  "conference" : {"name" : "Java Forum Stuttgart","city" : "Stuttgart"}
}} ]}
}

尽管我们已经搜索了某种类型,但是您也可以搜索多种类型或多种索引。

添加参数很容易,但是搜索请求可能变得更加复杂。 我们可能会要求根据标准突出显示或过滤文档。 Elasticsearch并没有为所有内容使用参数,而是提供了所谓的Query DSL ,这是在请求正文中传递并使用JSON表示的搜索API。

该查询可能是用户尝试搜索elasticsearch但却误输入了一部分的结果。 结果经过过滤,因此仅返回斯图加特市的会议讨论。

curl -XPOST "http://localhost:9200/conferences/_search " -d'
{"query": {"match": {"title" : {"query": "elasticsaerch","fuzziness": 2}}},"filter": {"term": {"conference.city": "stuttgart"}}
}'

这次我们正在索引会议中查询所有类型的所有文档。 查询对象请求一个常见查询,即文档标题字段上的匹配查询 。 查询属性包含用户将传递的搜索词。 模糊属性要求我们还应该查找包含与所请求术语相似的术语的文档。 这将照顾到拼写错误的术语,并返回包含elasticsearch的结果。 筛选器对象要求应根据会议所在的城市筛选所有结果。 应尽可能使用过滤器,因为它们可以被缓存,并且不计算相关性,这会使它们更快。

规范化文字

随着搜索无处不在,用户对它应该如何工作也抱有一些期望。 他们可能会使用仅与文档中的术语相似的术语,而不是发布完全匹配的关键字。 例如,用户可能正在查询术语curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall⪯tty=true" ,该术语是所包含术语curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall⪯tty=true"的单数形式,这意味着用例在德语中: curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall⪯tty=true"

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 0,"max_score" : null,"hits" : [ ]}
}

没有结果。 我们可以尝试使用上面已经看到的模糊搜索来解决这个问题,但是有更好的方法。 我们可以在索引编制过程中对文本进行规范化,以便两个关键字都指向文档中的同一术语。

Lucene,Elasticsearch中的库搜索和存储是通过提供用于搜索的基础数据结构,即反向索引来实现的。 术语会映射到它们所包含的文档中。称为分析的过程用于拆分传入的文本并添加,删除或修改术语。

分析

在左侧,我们可以看到两个已建立索引的文档,在右侧,我们可以看到将术语映射到包含它们的文档的倒排索引。在分析过程中,文档的内容按照特定于应用程序的方式进行拆分和转换因此可以将其放入索引中。 在这里,文本首先在空格或标点符号上分割。 然后所有字符都小写。 在最后一步中,采用依赖于语言的词干来尝试找到术语的基本形式。 这就是将我们的Anwendungsfälle转变为Anwendungsfall的原因。

在分析期间执行哪种逻辑取决于您的应用程序数据。 分析过程是确定搜索质量的主要因素之一,您可以花很多时间进行搜索。 有关更多详细信息,您可能需要看一下我关于索引数据的绝对基础的文章。

在Elasticsearch中,如何分析字段取决于类型的映射。 上周,我们看到我们可以在Elasticsearch中索引不同结构的文档,但是正如我们现在所看到的,Elasticsearch并非完全没有架构。 某个领域的分析过程只能确定一次,并且不容易更改。 您可以添加其他字段,但通常不更改现有字段的存储方式。

如果您不提供映射,Elasticsearch将对您索引的文档进行一些有根据的猜测。 它将查看在索引编制过程中看到的任何新字段,并尽其所能。 就我们的标题而言,它使用StandardAnalyzer,因为它是一个字符串。 Elasticsearch不知道我们的字符串使用哪种语言,因此它不会进行任何词干处理,这是一个很好的默认设置。

要告诉Elasticsearch使用GermanAnalyzer代替,我们需要添加一个自定义映射。 我们首先删除索引,然后再次创建它:

curl -XDELETE "http://localhost:9200/conferences/"curl -XPUT "http://localhost:9200/conferences/“

然后,我们可以使用PUT映射API传入我们类型的映射。

curl -XPUT "http://localhost:9200/conferences/talk/_mapping" -d'
{"properties": {"tags": {"type": "string","index": "not_analyzed"},"title": {"type": "string","analyzer": "german"}}
}'

我们仅提供了两个字段的自定义映射。 Elasticsearch将再次猜测其余字段。 创建生产应用程序时,您很可能会预先映射所有字段,但不相关的字段也可以自动映射。 现在,如果我们再次为文档建立索引并搜索单数,将找到该文档。

高级搜索

除了我们在这里看到的功能外,Elasticsearch还提供了更多功能。 您可以使用聚合自动收集结果方面,我们将在以后的文章中介绍这些聚合。 建议者可用于为用户执行自动建议,可突出显示术语,可根据字段对结果进行排序,您可以对每个请求进行分页……。 随着Elasticsearch在Lucene的基础上发展,构建高级搜索应用程序的所有优势均已存在。

结论

搜索是Elasticsearch的核心部分,可以与其分布式存储功能结合使用。 您可以使用DSL查询来构建表达性查询。 分析是搜索的核心部分,可以通过为类型添加自定义映射来影响分析。 Lucene和Elasticsearch提供了许多高级功能,可将搜索添加到您的应用程序中。

当然,由于Elasticsearch的搜索功能和分布特性,有很多用户正在使用Elasticsearch。 GitHub使用它来让用户搜索存储库 , StackOverflow在Elasticsearch中索引其所有问题和答案 , SoundCloud则在歌曲的元数据中进行搜索。

在下一篇文章中,我们将研究Elasticsearch的另一方面:使用它来索引地理数据,这使您可以按位置和距离对结果进行过滤和排序。

翻译自: https://www.javacodegeeks.com/2014/07/use-cases-for-elasticsearch-full-text-search.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用echarts时,鼠标首次移入屏幕会闪动,屏幕会出现滚动条

当我刷新,鼠标经过图表时,页面会出现滚动条 原因: 在echarts图表中出现 tooltip 时,画布的父标签(即:echarts.init()的标签)的宽高有时会发生变化,导致相对布局的div可能大小发生…

python正则计算器写法、用正则来匹配

1.# a 1-2*((60-30(-40/5)*(9-2*5/37/3*99/4*299810*568/14))-(-4*3)/(16-3*2)) 利用正则计算不用eval exec 思路: (1)先把内层的小括号匹配出来,从里向外,(2)然后计算小括号里面乘除的值,然后计算加减的值(3)把计算好的结果进行替换,[字符串的替换]""&q…

网页 添加QQ/MSN/旺旺 在线聊天代码

很多时候我们都喜欢在博客里加上自己的IM联系方式,如QQ:xxxxx之类的,为了方便别人与我们聊天和知道我们是否在线,添加在线图标就是一个不错的创意,当你在线时,你网页上的IM图标将是亮着的,非常方…

如何写一个作用域安全的构造函数

基础部分 构造函数本质上就是一个使用new操作符调用的函数,使用new调用时,构造函数内用到的this对象会指向新创建的对象实例: function Girlfriend(name, age, height) {this.name name;this.age age;this.height height; }// 使用new操…

使用Java 8 Lambda清理JUnit Throwable-Tests

最近,我参与了一个关于twitter和google 的简短在线讨论,其中涉及一个问题,即Java 8 Lambda表达式的到来为什么使catch-exception库 1过时了。 这是由简短的声明触发的,该声明将不再维护该库,因为lambda将使其变得多余。…

封装 axios 请求

vue 封装 js 方法 一、安装 axios 并引入: Axios 中文说明 安装axios:npm install axios因为基本上全局都会使用到 axios 方法,所以在 main.js 中引入: import axios from axios; Vue.prototype.$axios axios //全局注册&…

Response.Redirect 编码的问题

UTF-8 传递到 gb2312 HttpUtility.UrlEncode("要传递的字符参数",Encoding.GetEncoding("GB2312"))转载于:https://www.cnblogs.com/JensonBin/archive/2010/11/27/1889726.html

P1553 数字反转(升级版)

P1553 数字反转(升级版) 温馨提示 1.在处理小数的时候注意处理末尾的0,反转后末尾不得有多余的0 (判断的时候 s[ i ] ! 0 判断的是字符) 2.处理小数和分数的时候,要符号前后分别输出, flag标…

http协议以及防盗链技术

http协议,又称为超文本传输协议,顾名思义,http协议不仅能传输文本,还能传输图片,视频,压缩包等文件,http协议是建立在tcp/ip协议的基础之上的,http协议对php程序员来讲可以说是重中之…

移动端 flexible.js 布局详解

原本想直接引入原文链接,但是又担心作者哪天想不开注销账号,这么好的一篇文章看不到了,还是转载一下吧(/ω\)。 另外推荐一篇好文:移动端rem自适应实操讲解 本文讲的通过 flexible.js 实现了rem自适应,有了…

Gradle善良:获得更多的依赖性见解

在我们的大多数项目中,我们都依赖于其他代码,例如库或其他项目。 Gradle有一个不错的DSL来定义依赖关系。 依赖性在依赖性配置中分组。 这些配置可以自己创建,也可以通过插件添加。 一旦定义了依赖项,我们就可以通过dependencies任…

DotnetCharting控件的破解方法

在.net使用DotNetCharting控件生成报表统计图总结 文章中,不少博友提出“1.生成的图片带超链接导向官网,如何处理呀?2.我使用这个控件后,图形可以显示出来。但是发现一个小问题。就是在图形的左上方和图形的下面都隐含了超链接,鼠…

Android开发利器之ActivityTracker

版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水,有个小伙伴问到一个问题,”刚进公司 清单文件的activity 较…

js css模仿打字效果

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#myDiv{display: inline-block;width:500px;height:300px;background-color:rgba(0,0,0,0.3);colo…

iframe 高度根据子页面来确定

标题描述一、解决方法解决代码二、关于高度问题简单讲一下jquery中的 height()&#xff0c;innerHeight()、outHeight()&#xff0c;js中的offsetHeight、clientHeight、scrollHeight。如何获取没有给出高度的元素的高度&#xff1f;详细介绍offsetHeight,clientHeight,scrollH…

避免许多if块进行验证检查

在某些情况下&#xff0c;我们需要先验证输入数据&#xff0c;然后再将其发送到业务逻辑层进行处理&#xff0c;计算等。这种验证在大多数情况下是孤立完成的&#xff0c;或者可能包括与外部数据或其他输入的某些交叉检查。 看下面的示例&#xff0c;该示例验证用户输入的注册数…

谷歌逐步取消对IE6的支持

1月30日&#xff0c;据国外媒体报道&#xff0c;谷歌周五宣布&#xff0c;截至3月1日&#xff0c;谷歌将不再其谷歌Docs和谷歌网站服务支持IE6。如果IE用户想使用那些产品&#xff0c;他们必须至少升级到版本7&#xff0c;如同“其他许多公司已经停止支持如Internet Explorer 6…

国内手机号正则表达式

java的写法&#xff1a; String pattern "^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\\d{8}$"; javascript的写法&#xff1a; var pattern /^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\d{8}$/; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.co…

layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

咋说呢&#xff0c;因为对 layui 不太熟悉&#xff0c;这个弹出框搞了好久&#xff0c;看了好多解决方案&#xff0c;大致尝试了一下其中几种&#xff0c;在坑中无法自拔。。。总之终于搞出来了&#xff0c;在这里分享一下我的笔记。 着急的直接 戳这里 看解决代码。 尝试 1、…

html实现文字垂直居中且设置间隔

使用table和table-call布局 将表格作为一个table表&#xff0c;使用table-cell定义每个单元格的布局为table-cell, 抛出display的有效值 单元格中间的间隔使用 border-spacing:10px; border-collapse: separate;定义单元格vertical-align: middle; display: table-cell;代码源码…