了解ElasticSearch分析器

令人遗憾的是,许多早期的互联网啤酒配方不一定采用易于消化的格式。 也就是说,这些食谱是通常在电子邮件或论坛帖子中最初组成的非结构化的方向和成分混合列表。

因此,尽管很难轻松地将这些配方放入传统的数据存储中(表面上看是为了更轻松地进行搜索),但是它们对于当前形式的ElasticSearch来说是完美的。

因此,想象一下一个充满啤酒配方的ElasticSearch索引,因为……嗯……我喜欢酿造啤酒(也喝啤酒)。 老啤酒

首先,我将使用Node的ElasticSearch Client将一些啤酒配方添加到ElasticSearch中(请注意,代码虽然是CoffeeScript )。 我将这些啤酒配方添加到beer_recipes索引中,如下所示:

添加啤酒食谱

beer_1 = {name: "Todd Enders' Witbier",style: "wit, Belgian ale, wheat beer",ingredients: "4.0 lbs Belgian pils malt, 4.0 lbs raw soft red winter wheat, 0.5 lbs rolled oats, 0.75 oz coriander, freshly ground Zest from two table oranges and two lemons, 1.0 oz 3.1% AA Saaz, 3/4 corn sugar for priming, Hoegaarden strain yeast"
}client.index('beer_recipes', 'beer', beer_1).on('data', (data) ->console.log(data)
).exec()

请注意,如何在ingredients字段中找到食谱JSON文档的有趣部分,即beer_1 。 该字段基本上是一大串有价值的文本(您可以想象此字符串本质上是电子邮件的正文)。 因此,尽管ingredients字段是非结构化的,但人们显然仍希望进行搜索。

我将再添加一个食谱以达到良好的效果:

添加第二份啤酒食谱

beer_2 = {name: "Wit",style: "wit, Belgian ale, wheat beer",ingredients: "4 lbs DeWulf-Cosyns 'Pils' malt, 3 lbs brewers' flaked wheat (inauthentic; will try raw wheat nest time), 6 oz rolled oats, 1 oz Saaz hops (3.3% AA), 0.75 oz bitter (Curacao) orange peel quarters (dried), 1 oz sweet orange peel (dried), 0.75 oz coriander (cracked), 0.75 oz anise seed, one small pinch cumin, 0.75 cup corn sugar (priming), 10 ml 88% food-grade lactic acid (at bottling), BrewTek 'Belgian Wheat' yeast"
}client.index('beer_recipes', 'beer', beer_2).on('data', (data) ->console.log(data)
).exec()

这是一个炎热的夏日,我想我想用柠檬作为原料制作啤酒(要清楚:我想用柠檬皮(它是由柠檬皮制成的))。 因此,自然地,我需要查找(即搜索 )其中含有柠檬的食谱。

因此,我将在索引中搜索包含“柠檬”一词的食谱,如下所示:

寻找柠檬

query = { "query" : { "term" : { "ingredients" : "lemon" } } }client.search('beer_recipes', 'beer', query).on('data', (data) ->data = JSON.parse(data)for doc in data.hits.hitsconsole.log doc._source.styleconsole.log doc._source.nameconsole.log doc._source.ingredients
).exec()

但是什么都没有显示-没有结果! 这是为什么?

如果仔细查看前面的代码示例(具体来说是beer_1 JSON文档),您会发现文本中有“柠檬”一词(即“……两个橙子和两个柠檬……”)。 事实证明,默认情况下,ElasticSearch索引值的方式, 柠檬不一定要匹配- 柠檬却可以。

寻找柠檬

query = { "query" : { "term" : { "ingredients" : "lemons" } } }client.search('beer_recipes', 'beer', query).on('data', (data) ->data = JSON.parse(data)for doc in data.hits.hitsconsole.log doc._source.styleconsole.log doc._source.nameconsole.log doc._source.ingredients
).exec()

瞧,此搜索返回了成功! 但这至少是不便的。 基本上, ingredients字段中的单词按原样标记。 因此,搜索“柠檬”有效,而“柠檬”无效。 注意:有多种搜索机制,对“ lemon *”的搜索应已返回结果。

将文档添加到ElasticSearch索引后,将分析其字段并将其转换为tokens 。 对索引执行搜索时,将对这些标记进行搜索。 ElasticSearch如何标记文档是可以配置的。

可以使用不同的ElasticSearch分析器-从允许您支持非英语语言搜索的语言分析器到雪球分析器,后者将一个单词转换为其词根(或词干,并且从词创建词干的过程称为词干 ),产生一个更简单的令牌。 例如,“柠檬”雪球将是“柠檬”。 或者,如果在经过雪球分析的文档中有“敲门”和“敲门”一词,则这两个词都将以“敲门”为词干。

您可以通过索引映射API更改文档的标记方式,如下所示:

使用cURL更改索引的映射

curl -XPUT 'http://localhost:9200/beer_recipes' -d '{ "mappings" : {"beer" : {"properties" : {"ingredients" : { "type" : "string", "analyzer" : "snowball" }}}}
}'

请注意,以上映射如何指定将通过雪球分析器分析ingredients字段。 另请注意, 开始向其中添加文档之前 ,必须更改索引的映射! 因此,在这种情况下,我需要删除索引,运行上面的映射调用,然后重新添加这两个配方。

现在,我可以开始在配方中搜索“柠檬”或“柠檬”成分。

现在搜索柠檬有效!

query = { "query" : { "term" : { "ingredients" : "lemon" } } }client.search('beer_recipes', 'beer', query).on('data', (data) ->data = JSON.parse(data)for doc in data.hits.hitsconsole.log doc._source.styleconsole.log doc._source.nameconsole.log doc._source.ingredients
).exec()

请记住, 滚雪球可能会无意间使搜索结果的相关性降低 。 可以将长词变成更常见但完全不同的词。 例如,如果您将包含单词“ sextant”的文档滚雪球,则单词“ sex”将作为词干。 因此,搜索“ sextant”也将返回包含单词“ sex”的文档(反之亦然)。

ElasticSearch为您提供了强大的搜索引擎; 另外,略微考虑了如何分析文档的内容,您将使搜索事件更加相关。

参考: The Disco Blog博客中的JCG合作伙伴 Andrew Glover 理解了ElasticSearch Analyzers 。

翻译自: https://www.javacodegeeks.com/2013/09/understanding-elasticsearch-analyzers.html

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

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

相关文章

c++简单程序设计-2

1.验证性实验部分①函数声明和函数定义各自的作用及二者的区别:函数声明就是调用函数之前提示一下有这个函数函数定义就是写一个函数②什么是形参?什么是实参?函数参数和返回值在函数中起到什么作用?函数定义时写的参数叫做形参&a…

Linux虚机安装配置Tomcat

d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache-tomcat-8.0.53.tar.gz 第三步:配置环境变量 进入到Tomcat下bin包…

Nginx安装及配置详解

nginx概述 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过三个方面…

servlet简单概括总结

最近在看java web的相关内容,不管是整体还是细节,要学习的知识有很多,所以有一个好的学习体系非常重要。在阅读学习一些博客和教程中关于servlet的内容后,现将知识体系和自己的总结体会进行梳理,希望在更深入理解的同时…

php超强后门在任意位置创建文件,php大马:.user.ini文件构成的超强PHP后门

这个估计很多同学看了不屑,认为是烂大街的东西了:那么我来个新的吧:。它比用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi,我的IIS php5.3…

Restlet框架– Hello World示例

Restlet是用于Java平台的轻量级,全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输,数据格式和服务描述标准,例如HTTP和HTTPS,SMTP,XML,JSON,Atom和WAD…

Servlet 3的异步Servlet功能

在深入了解什么是异步Servlet之前,让我们尝试了解为什么需要它。 假设我们有一个Servlet,处理时间很长,如下所示。 LongRunningServlet.java package com.journaldev.servlet;import java.io.IOException; import java.io.PrintWriter;impo…

excel的宏与VBA入门——代码调试

直接介绍重点: 常用的操作是导航栏的逐句与断点: 添加断点:调试->切换断点 单步运行:调试->逐句 查看变量的窗口:视图->本地窗口 转载于:https://www.cnblogs.com/jiangbei/p/9561352.html

php访问服务器文件路径,PHP与服务器文件系统的简单交互

1、php.ini中关于文件上传的设置指令2、文件上传过程(1)上传文件提交表单html代码:Adminstration - upoload new filesUpload new filesUpload a file(2)php处理上传文件代码①在php脚本中,需要处理的数据保存在超级变量数组$_FILES中,开启re…

django F和Q 关键字使用

F 的使用: 想给表里每个价格加上一百就要用上F,直接加是不行的。 转载于:https://www.cnblogs.com/wuheng-123/p/9561422.html

【刷题】BZOJ 4176 Lucas的数论

Description 去年的Lucas非常喜欢数论题&#xff0c;但是一年以后的Lucas却不那么喜欢了。 在整理以前的试题时&#xff0c;发现了这样一道题目“求Sigma(f(i)),其中1<i<N”&#xff0c;其中 表示i的约数个数。他现在长大了&#xff0c;题目也变难了。 求如下表达式的值&…

Java 8的新增功能(第I部分-JavaFX)

免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 Java 8已在大约两个月前完成功能&#xff0c;并且开发者预览版即将来临&#xff08;两周后&#xff09;。 这篇博客文…

mysql数据库sql语句优化

昨天帮同事优化了一个sql语句发出来共勉下: SELECT T.*, ( SELECT S.codeName FROM sys_codelist S WHERE S.codeValue T.packagingtype AND S.kindCode PACKAGING ) AS packagingtypeName, S.codeName AS codename, ( SELECT picpath FROM zl_b_gd_pic WHERE 1 1 AND gdid …

java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…

python第一个程序HelloWorld

在写第一个python程序之前&#xff0c;我们还需要了解的一个东西就是python解释器 解释器&#xff0c;顾名思义&#xff0c;就是解释一段代码的机器&#xff0c;程序运行的平台&#xff0c;例如Java的解释器就是jdk。 我们在写好的python代码&#xff0c;需要在解释器上执行&am…

Python中的__new__()方法的使用

__new__() 函数只能用于从object继承的新式类。 先看下object类中对__new__()方法的定义&#xff1a; class object:staticmethod # known case of __new__def __new__(cls, *more): # known special case of object.__new__""" T.__new__(S, ...) -> a new …

用Java分割大型XML文件

上周&#xff0c;我被要求用Java编写一些东西&#xff0c;该东西能够将单个30GB XML文件拆分为可配置文件大小的较小部分。 该文件的使用者将是一个中间件应用程序&#xff0c;该应用程序存在XML较大的问题。 在后台&#xff0c;它使用某种DOM解析技术&#xff0c;使它在一段时…

信号与线性系统翻转课堂笔记9——傅里叶变换概念

信号与线性系统翻转课堂笔记9——傅里叶变换 The Flipped Classroom9 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&#xff09;…

from 下拉框多个值提交_Git commit 多行信息提交

git commit可接受多个消息标志(-m)来允许多行提交原文地址&#xff1a;https://www.stefanjudis.com/today-i-learned/git-commit-accepts-several-message-flags-m-to-allow-multiline-commits/原文作者&#xff1a;Stephan Schneider在命令行上使用git时&#xff0c;您可能已…

处理缓慢的资源泄漏

使用Java监视器查找资源泄漏 查找缓慢的资源泄漏是使应用程序服务器长时间保持正常运行的关键。 在这里&#xff0c;我解释了如何使用Java监视器来发现缓慢的资源泄漏&#xff0c;以及如何验证它们是实际的泄漏&#xff0c;而不仅仅是额外的预分配到某些HTTP连接器或数据库池中…