全文搜索现在已经是很常见的功能了,当然你也可以用mysql加Sphinx实现。但开源的Elasticsearch(简称ES)目前是全文搜索引擎的首选。目前像GitHub、维基百科都使用的是ES,它可以快速的存储,搜索和分析数据。

一、安装与启动

ES的运行需要依赖java环境,可以在命令行运行 java --version 。如果出现

说明已经安装了,否则你就需要安装下java环境。

然后我们就可以开始装ES了。1、可以用docker容器安装。2、用压缩包安装。

我是用压缩包安装的。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
tar -xzf elasticsearch-6.3..tar.gz
cd elasticsearch-6.3./

然后输入 ./bin/elasticsearch 就可以启动ES了。在浏览器上输入 localhost: ,如果出现

就说明ES成功跑起来了。

不了解ES的同学可以去看看阮老师的这篇文章http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

二、IK分词

ES默认的分词是英文分词,对中文分词支持的并不好。所以我们就需要安装ik中文分词。让我们看看区别。

在这里需要说明的一点时,ES很多API请求都是GET带上了Request Body。所以通过浏览器或者postman等工具发起GET请求时会报错。有两种方法可以解决。

1、通过命令含的curl请求。

curl -X GET "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"analyzer" : "standard",
"text" : "this is a test"
}
'

2、在代码中通过curl请求。

// 通过php的guzzle包发起的请求
$client = new Client();
$response = $client->get('localhost:9200/_analyze', [
'json' => [
'analyzer' => 'standard',
'text' => "功能进阶",
]
]); $res = ($response->getBody()->getContents());

然后我们来看看ik中文分词和ES默认的分词区别。同样是上面的请求

ES默认分词结果

{
"tokens": [
{
"token": "功",
"start_offset": ,
"end_offset": ,
"type": "<IDEOGRAPHIC>",
"position":
},
{
"token": "能",
"start_offset": ,
"end_offset": ,
"type": "<IDEOGRAPHIC>",
"position":
},
{
"token": "进",
"start_offset": ,
"end_offset": ,
"type": "<IDEOGRAPHIC>",
"position":
},
{
"token": "阶",
"start_offset": ,
"end_offset": ,
"type": "<IDEOGRAPHIC>",
"position":
}
]
}

ik中文分词结果

ik分词也分两种分析器。ik_smart:尽可能少的进行中文分词。ik_max_word:尽可能多的进行中文分词。

$response = $client->get('localhost:9200/_analyze', [
'json' => [
'analyzer' => 'ik_max_word',
'text' => "功能进阶",
]
]);

得到的结果为:

{
"tokens": [
{
"token": "功能",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
},
{
"token": "能进",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
},
{
"token": "进阶",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
}
]
}

而ik_smart

$response = $client->get('localhost:9200/_analyze', [
'json' => [
'analyzer' => 'ik_smart',
'text' => "功能进阶",
]
]);

的结果为

{
"tokens": [
{
"token": "功能",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
},
{
"token": "进阶",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
}
]
}

其实他们的区别通过名字你也可以略知一二。哈哈。。。

假如有人想问,我就想把“功能进阶”当成一个词来搜索,可以吗?

Of course!!

这时候我们就要自定义分词。进入你的ES目录,运行 cd config/analysis-ik/ 进去ik分词的配置。找到IKAnalyzer.cfg.xml文件,然后 vi IKAnalyzer.cfg.xml 。

我在 elasticsearch-6.3./config/analysis-ik 目录下,创建了 custom/mydict.dic ,然后添加到上图的红色框框中,这就是你自定义分词的文件。如果有多个文件,可以用英文分号(;)隔开。

可以看到,我在自定义中文分词文件中添加了“功能进阶”这个词。这时候用ik_smart分析器的结果是:

{
"tokens": [
{
"token": "功能进阶",
"start_offset": ,
"end_offset": ,
"type": "CN_WORD",
"position":
}
]
}

很好,这就是我们想要的。

三、Query DSL

  • match

    查询语法如下:title是需要查询的字段名,可以被替换成任何字段。query对应的是所需的查询。比如这里会被拆分成‘php’和‘后台’,应为operator是or,所以ES会去所有数据里的title字段查询包含‘后台’和‘php’的,如果operator为and,这查询的是即包含‘后台’又有‘php’的数据,这应该很好理解。

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'match' => [
'title' => [
'query' => '后台php',
'operator' => 'or',
]
]
]
]
]);
  • multi_match

    如果想在多个字段中查找,那就需要用到multi_match查询,语法如下:

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'multi_match' => [
'query' => '张三 php',
'fields' => ['title', 'desc', 'user']
]
]
]
]);
  • query_string

    查询语法如下:类似match查询的operator,在这里需要在query中用OR或AND实现。

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'query_string' => [
'query' => '(张三) OR (php)',
'default_field' => 'title',
]
]
]
]);

多字段查询如下:

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'query_string' => [
'query' => '(张三) OR (php)',
'fields' => ['title', 'user'],
]
]
]
]);
  • range query

    这是范围查询,例如查询年龄在10到20岁之间的。查询语法如下:

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'range' => [
'age' => [
'gte' => 10,
'lte' => 20,
],
]
]
]
]);

gte表示>=,lte表示<=,gt表示>,lt表示<。

  • bool查询

  bool查询的语法都是一样的。如下:

$response = $client->get('localhost:9200/accounts/person/_search', [
'json' => [
'query' => [
'bool' => [
'must/filter/should/must_not' => [
[
'query_string' => [
'query' => '研发',
]
],
[
'range' => [
'age' => [
'gt' => 20
]
]
], ],
]
]
]
]);

  1)must:must查询是查询字段中必须满足上面两个条件,并且会计算到score中。

  2)filter:filter查询与must一样,都必须满足上面两个条件,只不过查询结果不会计算score,也就是score始终为0.

  3)should:should查询只需要满足上面两种查询条件中的一种即可。

  4)must_not:must_not查询是必须不满足上面两个查询条件。

以上也是我看文档总结出来的,如有不对的地方,望大神指点。

Elasticsearch入门和查询语法分析(ik中文分词)的更多相关文章

  1. elasticsearch ik中文分词器安装

    特殊说明:灰色文字用来辅助理解的. 安装IK中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要 ...

  2. ElasticSearch速学 - IK中文分词器远程字典设置

    前面已经对”IK中文分词器“有了简单的了解:  但是可以发现不是对所有的词都能很好的区分,比如:  逼格这个词就没有分出来. 词库 实际上IK分词器也是根据一些词库来进行分词的,我们可以丰富这个词库. ...

  3. 搜索引擎ElasticSearch系列(五): ElasticSearch2.4.4 IK中文分词器插件安装

    一:IK分词器简介  IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源 ...

  4. elasticsearch使用ik中文分词器

    elasticsearch使用ik中文分词器 一.背景 二.安装 ik 分词器 1.从 github 上找到和本次 es 版本匹配上的 分词器 2.使用 es 自带的插件管理 elasticsearc ...

  5. Elasticsearch:IK中文分词器

    Elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze { "text": "我爱北京天安门&quo ...

  6. Solr5.5.1 IK中文分词配置与使用

    前言 用过Lucene.net的都知道,我们自己搭建索引服务器时和解决搜索匹配度的问题都用到过盘古分词.其中包含一个词典. 那么既然用到了这种国际化的框架,那么就避免不了中文分词.尤其是国内特殊行业比 ...

  7. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  8. 对本地Solr服务器添加IK中文分词器实现全文检索功能

    在上一篇随笔中我们提到schema.xml中<field/>元素标签的配置,该标签中有四个属性,分别是name.type.indexed与stored,这篇随笔将讲述通过设置type属性的 ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器

    注: elasticsearch 版本6.2.2 1)集群模式,则每个节点都需要安装ik分词,安装插件完毕后需要重启服务,创建mapping前如果有机器未安装分词,则可能该索引可能为RED,需要删除后 ...

随机推荐

  1. SpringBoot访问html访问不了的问题

    springboot默认是不支持jsp的 注意pom.xml是否添加了thymeleaf的依赖 <dependency> <groupId>org.springframewor ...

  2. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  3. C#网络编程(二)应用篇

    (一)TcpListen类.TcpClient类 TcpListener类和TcpClient类都是System.Net.Sockets命名空间下的类,利用TcpListener和TcpClient可 ...

  4. 彻底解密 Spark 的 HashShuffle

    本课主题 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...

  5. 深入浅出SharePoint2010——请假系统实战

    一.需求分析文档 二.请假系统无代码解决方案 2.1 数据框架设计 2.2 权限设计 2.3 表单设计 2.4 工作流设计 2.5 门户主页设计 三.请假系统第三方解决方案(Nintex) 四.请假系 ...

  6. Spring Boot 的配置文件

    Profile 配置 Profile 是 Spring 用来针对不同的环境对不同的配置提供支持的,全局的 Profile 配置使用 application-{profile}.properties ( ...

  7. [零基础学JAVA]Java SE面向对象部分.面向对象基础(05)

    1.继承 2.多态 3.final 4.重载与覆写 5. this/super 6.抽象类 7.接口 java: class Person{ private String name;    priva ...

  8. jQuery——checkbox

    全选.全部选 $('#checkAll').click(function(){ $('input[name="subBox"]').prop("checked" ...

  9. 安卓原生与hml交互(WebView基础)

    WebView加载页面 webView有两种加载方式, 加载网络地址 webView.loadUrl("www.xxx.com/index.html"); 加载本地资源 webVi ...

  10. vue项目搭建笔记

    安装nodejs后, 首先安装淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org 淘宝镜像安装成功后,安装vue脚手 ...