搜索服务器Elasticsearch
基本
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
安装与插件添加
一、安装 elasticsearch 成服务 es-root\bin>service.bat install
二、安装 head 插件 es-root\bin>plugin install mobz/elasticsearch-head
三、安装 bigdesk 插件 es-root\bin>plugin install lukas-vlcek/bigdesk
四、安装 IK Analysis Plugin
五、安装 Index Termlist Plugin
查询入门
第一节:match与term 查询
一、 match(单分词匹配查询)(任意)
match(单分词匹配查询),会对查询语句分词,比如"代表团参加审议"会被分词为"代表团 参加 审议", 那么对应查询字段上包含这三个分词中的一个或多个的所有文档就会被搜索出来,不要求完全匹配,但会按分词的匹配情况打分。
1、执行代码
http://localhost:9200/newooo/_search/ 【POST】
{
"query": {
"match": {
"content": {
"query": "代表团参加审议"
}
}
}
}
代表团参加审议——》代表团 参加 审议
2、 执行效果 (例句命中 参加 审议 2个分词,故选中!)
二、 match_phrase (多分词匹配查询) (精确)
1、执行代码
http://localhost:9200/newooo/_search/ 【POST】
{
"query": {
"match_phrase": {
"content": {
"query": "分别参加审议"
}
}
}
}
分别参加审议——>分别 参见 审议 ——》三个分词都必须包含,且三个分词间没有其他分词,否则落选。
2、执行效果 (上例中,分词包含 参加、 审议,但没有 分别 ,故未中选。)
三、match_phrase (多分词匹配查询)(宽松)
完全匹配可能比较严,我们会希望有个可调节因子,允许多分词间其他分词出现,那就需要用到slop,间距因子,即允许间隔的分词个数。体会下列加上slop间距因子的差异!
a.严格精确多分词匹配分别、审议,失败;

b.允许间距因子的多分词匹配,成功!————加上了slop=1

四、term 查询 (查询语句不分词,查询目标字段分词与否—随意)
term,不对查询语句分词。在对Analyzed 文档查询时,与bool查询(must、must_not、should)等组合,可以替代match==query_string使用。在对NotAnalyzed文档查询时,不是网上人云亦云的部分匹配方式!而是:term与目标字段内容完全相等才算匹配!
ELASTICSEARCH TERM OR TERMS QUERY NOT WORKING? START HERE.(与我的实验结果一致)
https://www.pmg.com/blog/elasticsearch-term-terms-query-not-working/
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html ;
————部分匹配(通配查询),请用下列方法:
prefix,不对查询语句分词。http://blog.csdn.net/dm_vincent/article/details/42001851 ;
wildcard,不对查询语句分词。http://blog.csdn.net/dm_vincent/article/details/42024799
regexp,不对查询语句分词。http://blog.csdn.net/dm_vincent/article/details/42024799
第二节:bool查询与match查询的关系
一、match查询(默认or操作符)== bool查询组合起来的should查询
match查询,其实只是简单地将生成的term查询包含在了一个bool查询中。通过默认or操作符,每个term查询都以一个语句被添加,所以等效于一个should语句匹配(should语句,对于一个文档,只要有一个查询分词匹配,那么这个文档就被看成是匹配的。)。以下两个查询是等价的:
{
"query": {
"match": {
"title": {
"query": "上海奶粉"
}
}
},
"from": 0,
"size": 100,
"sort": {
"time": {
"order": "desc"
}
}
}
------------------------------------------
{
"query": {
"bool": {
"should": [
{"term": {"title": "上海"}},
{"term": {"title": "奶粉"}}
]
}
},
"size": 100
......
}
二、match查询(and操作符)== bool查询组合起来的must查询
match查询,使用and操作符时,所有的term查询都以must语句被添加,因此所有的查询都需要匹配。以下两个查询是等价的:
{
"query": {
"match": {
"title": {
"query": "上海奶粉",
"operator": "and"
}
}
},
"from": 0,
"size": 100,
"sort": {
"time": {
"order": "desc"
}
}
}
-----------------------------------------------
{
"query": {
"bool": {
"must": [
{"term": {"title": "上海"}},
{"term": {"title": "奶粉"}}
]
}
},
"size": 100
......
}
三、match查询(minimum_should_match)
如果指定了minimum_should_match参数,它会直接被传入到bool查询中,下面两个查询是等价的:
{
"query": {
"match": {
"title": {
"query": "quick brown fox",
"minimum_should_match": "75%"
}
}
},
"size": 100
}
----------------------------------------------------------
{
"query": {
"bool": {
"should": [
{"term": {"title": "brown"}},
{"term": {"title": "fox"}},
{"term": {"title": "quick"}}
],
"minimum_should_match": 2
}
},
"size": 100
}
分词专题
一、为elasticsearch安装分词器
在elasticsearch.yml文件末,添加下列文字。
index.analysis.analyzer.ik.type : "ik"
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_smart:
type: ik
use_smart: true
ik_max_word:
type: ik
use_smart: false
提示:不用去变动elasticsearch的default analyzer设置。
分词测试:http://localhost:9200/163/_analyze?analyzer=ik_smart&pretty=true&text=食品安全
————可以帮助确定目标是否可以视为一个分词,或者看看目标会分词成什么样。
二、自定义字典
config/ik/IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典,例如搜狗输入法词库—sougou.dic -->
<entry key="ext_dict">
custom/mydict.dic;
custom/single_word_low_freq.dic;
custom/sougou.dic;
</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">
custom/ext_stopword.dic
(停留词,指文本中出现频率很高,但实际意义又不大的词,主要指副词、虚词、语气词等。如“是”、“而是”、“吗”等。建立停留词过滤字典,可以在为文本建立索引(分词)时,过滤(忽略)掉这些词。—可以自己丰富完善。)
</entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">location</entry>
</properties>
三、热更新 IK 分词方法
IK插件支持热更新 IK 分词。
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">location</entry>
其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。
1、该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
2、该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。
满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。
可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在web server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。
常见问题
1.自定义词典为什么没有生效? 请确保你的扩展词典的文本格式为 UTF8 编码 。
参考:http://wiki.jikexueyuan.com/project/elasticsearch-definitive-guide-cn/010_Intro/00_README.html
搜索服务器Elasticsearch的更多相关文章
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。
前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...
- 【SpringBoot】搜索框架ElasticSearch介绍和整合SpringBoot
========================12章 搜索框架ElasticSearch介绍和整合SpringBoot ============================= 加入小D课堂技术交 ...
- 12章 搜索框架ElasticSearch介绍和整合SpringBoot 4节课
1.搜索引擎知识和搜索框架elasticsearch基本介绍 简介:通过京东电商 介绍什么是搜索引擎,和开源搜索框架ElasticSearch6.x新特性介绍 前言:介绍ES的主要特点和使用场 ...
- Spring Data Solr教程(翻译) 开源的搜索服务器
Solr是一个使用开源的搜索服务器,它采用Lucene Core的索引和搜索功能构建,它可以用于几乎所有的编程语言实现可扩展的搜索引擎. Solr的虽然有很多优点,建立开发环境是不是其中之一.此博客条 ...
- Apache Solr采用Java开发、基于Lucene的全文搜索服务器
http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...
- 和我一起打造个简单搜索之ElasticSearch集群搭建
我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌.尺寸.适用季节.价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品. 站内搜索对 ...
- 和我一起打造个简单搜索之ElasticSearch入门
本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...
- 使用 Solr 构建企业级搜索服务器
最近因项目需要一个全文搜索引擎服务, 在考察了Lucene及Solr后,我们选择了Solr. 本文简要记录了基于Solr搭建一个企业搜索服务器的过程.网上的资料太多千篇一律,也可能版本不同,总之在参照 ...
- Spring Data 整合 ElasticSearch搜索服务器
一.基于 maven 导入坐标(pom.xml文件) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...
随机推荐
- ios开发瀑布流框架的应用
一:瀑布流框架的应用:将封装好的瀑布流框架导入,遵守协议 二:代码: #import "HMShopsViewController.h" #import "HMShopC ...
- Android JNI编程(一)——JNI概念以及C语言Dev-C++开发环境搭建、编写HelloWorld
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:JNI是什么呢? JNI:JNI是JavaNative Interfac ...
- 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- [TypeScript] Create a fluent API using TypeScript classes
You can create an easy to chain API using TypeScript classes. Learn about the thisreturn type annota ...
- 【codeforces 768A】Oath of the Night's Watch
[题目链接]:http://codeforces.com/contest/768/problem/A [题意] 让你统计这样的数字x的个数; x要满足有严格比它小和严格比它大的数字; [题解] 排个序 ...
- Graphics processing architecture employing a unified shader
FIELD OF THE INVENTION The present invention generally relates to graphics processors and, more part ...
- 小强的HTML5移动开发之路(24)—— PhoneGap Android开发环境搭建
有关JDK及Android开发环境的搭建请看我前面的博文:http://blog.csdn.net/dawanganban/article/details/9748497 一.下载PhoneGap 下 ...
- request.getSession().getServletContext().getRealPath()的一些坑
今天是学校机房的服务器上对之前的一个网站升级时发现了一个bug,我自己的机器上用的tomcat8,机房上是tomcat7,结果一运行就开始报找不到文件,最后发现是文件分隔符的问题 原来在代码中涉及到路 ...
- 【29.89%】【codeforces 734D】Anton and Chess
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- HDU 1789 Doing Homework again(馋)
意甲冠军 参加大ACM竞争是非常回落乔布斯 每一个工作都有截止日期 未完成必要的期限结束的期限内扣除相应的积分 求点扣除的最低数量 把全部作业按扣分大小从大到小排序 然后就贪阿 能完毕 ...