了解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…

java 同步的方法_关于Java中的同步方法

我有一个关于Java中方法同步的问题.考虑一个具有3个同步方法的类.class MyClass{public synchronized void methodA(){ ... }public synchronized void methodB(){ ... }public synchronized void methodC(){ ... }}考虑myObject,myClass的一个实例.以下内容哪些是对的&#xf…

jQuery获取隐藏域和radio单项框的值

获得只有Name的隐藏Input的值$("input[typehidden][name隐藏Input的名称]").val() 或 $("input[name隐藏Input的名称]:hidden").val()radio设值$("input[typeradio][value值]").attr("checked",true);eg.$("input[typeradio][v…

Linux虚机安装配置Tomcat

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

Java Comparable接口的陷阱

Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法。 自然顺序对标量和其他非常简单的对象有意义,但是当我们使用面向业务的领域对象时,自然顺序就变得更加复杂。 从业务经理的角度来看,交易对象的自然顺序可以是交易的价值&…

mysql 创建视图

CREATE VIEW v_image_org_user_album AS--创建视图并命名v_image_org_user_album SELECT --先开from中表的命名 a.id AS imgid,--将a表中的id命名为新的表(视图)中的imgid字段,剩下的都一样,就是将之前的字段重新命名到…

jQuery.ajaxPrefilter()函数的使用

jQuery.ajaxPrefilter( [dataTypes ], handler(options, originalOptions, jqXHR) )返回: undefined 描述: 在每个请求之前被发送和 $.ajax()处理它们前处理,设置自定义Ajax选项或修改现有选项。 添加的版本: 1.5jQuery.ajaxPrefilter( [dataTypes ], handler(optio…

linux php自动执行_linux下实现定时执行php脚本

在linux中输入命令复制代码 代码如下:crontab -e然后使用vim的命令编辑打开的文件,输入复制代码 代码如下:0 * * * * /usr/bin/php -f /home/userxxx/update.php保存,退出,好了,现在系统会在每个0点自动执行update.php脚本&#x…

Nginx安装及配置详解

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

Gradle:我们需要另一个构建工具吗?

在Java开发的早期,我们要么没有太多的构建工具需求,要么就使用了其他环境中的工具。 我仍然记得构建shell脚本并创建用于开发Java的文件。 生成文件特别有趣,因为这是一个在设计时就没有考虑Java的工具。 迁移到不同的操作系统环境也很困难。…

servlet简单概括总结

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

jquery学习之-查找父元素方法parent() parents() closest()的区别

parent()、parents()与closest()方法两两之间有类似又有不同&#xff0c;本篇简短的区分一下这三个方法。通过本篇内容&#xff0c;大家将会在以后使用.parent()、parents()和closest()时不会显得无从下手。 我们直接看例子来来说明一下这三个方法的使用区别&#xff1a; <u…

二叉树的递归遍历与复制

1 #include <iostream>2 3 //定义树的数据结构4 struct BiTNode5 {6 int data;7 struct BiTNode *lchild, *rchild;8 };9 10 typedef struct BiTNode BiTNode;11 typedef struct BiTNode* BiTree;12 13 14 //前序遍历15 void preOrder(BiTNode *root)16 {17…

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

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

CSS3-字体渐变色

示例&#xff1a;Maugers Blog <!DOCTYPE HTML> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>Maugers Blog</title><style type"text/css…

Restlet框架– Hello World示例

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

BZOJ2809 dispatching 【可并堆】

题目分析&#xff1a; yy一下就知道了&#xff0c;合并用可并堆少个log。 代码&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 4 const int maxn 102000;5 6 int n,m;7 int b[maxn],c[maxn],l[maxn],sz[maxn];8 long long tot[maxn];9 int dis[maxn],v…

php ci 框架 扩展缓存类,CodeIgniter扩展核心类实例详解

本文实例讲述了CodeIgniter扩展核心类的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;CI中对核心类、辅助类和函数的扩展是相当方便的&#xff0c;配置文件中指定了subclass_prefix扩展前缀&#xff0c;默认为MY_&#xff0c;扩展时需要以该配置为前缀&#xff…

jQuery下如何使用Json传递数据

json的结构为&#xff1a; {\"data\":[{\"key1\":\"1\"},{\"key2\":\"2\"},{\"key3\":\"3\"}]} 因为要进行输出&#xff0c;所以里边加了转义符&#xff0c;希望大家不要在此迷惑。下边&#xff0c;我就…

七牛云

待续....转载于:https://www.cnblogs.com/tovictory/p/8647883.html