Elasticsearch的概念
1、全文检索是什么
我们生活中的数据总体分为两种:结构化数据和非结构化数据
- 结构化数据:指句又固定格式或有限长度的数据,如数据库中的数据,元数据等。
- 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件。
非结构化数据查询方法:顺序扫描和全文检索
- 顺序扫描法:比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到为,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,知道扫描完所有的文件。
- 全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取中的然后重新组织的信息,我们称为索引。例如:字典。字典的拼音表和不受检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有字节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来按一定的顺序排序,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可索引进行搜索的过程就叫全文检索(Full-text Search)。
使用全文检索的网站特点:多条件组合、即使响应、高使用频率、全文检索
2、常见的全文检索
Lucene:搜索引擎库、功能强大、接入复杂
solr:基于Lucene的搜索引擎服务器
Elasticsearch:基于Lucene的搜索引擎服务器,分布式
3、Elasticsearch全文检索的概念
node:节点,部署Elasticsearch程序的服务器
cluster:集群,多节点组成的结构
index:索引,相当于关系型数据库
shard:索引分片,索引可以被设置为多个分片
repllcas:索引副本
type:类型,对应于关系型数据库的table
document:文档,类似于关系型数据库的row
文档三元素
- _index:文档对应的索引
- _type:文档对应的数据类型
- _ID:文档的唯一ID
Elasticsearch命令执行
1、安装Elasticsearch
使用Dockerfile文件安装Elasticsearch和Kibana
优先设置,使用超级管理员设置。设置进程能拥有的最多的内存区域
sudo vi /etc/sysctl.conf #修改此文件
sysctl.conf文件理最后代码段怎加如下代码,注意不要被注释。
vm.max_map_count=262144
修改docker-compose.yml文件,只安装Elasticsearch和Kibana
sudo docker-compose up -d
安装成功后访问:
http://172.16.16.199:9200/
如下图,表示Elasticsearchan安装成功
cluster_name:集群名称
number:Elasticsearch版本号
lucene_verslon:lucene版本
访问
http://192.168.83.99:5601
如下图,表示kibana安装成功,此处实际上还要配置kibana工具,要配置连接上 Elasticsearch
此处注意修改/usr/local/kiabana-6.2.4-linux-x86_64/config/kibana.yml中
elasticsearch.url:"http://192.168.83.99:920" #把此处ip改成自己的虚拟机的ip
2、创建索引
语法:
PUT /索引名称
{
"settings":{
"number_of_shards":分片数目
"number_of_replicas":副本数量
},
"mappings":{ ... } #类似于在数据库中定义表结构
}
一级目录的“/”可以省略,索引的名称必须是小写的,不可重名,默认的分片数是5到1024,默认的备份数是1
示例:
PUT /lin #创建lin索引
PUT lin
"settings" : {
"number_of_shards" : 2,
"number_of_replicas" : 1
}
}-#表里面有哪些字段、字段是什么类型、字段的默认值
PUT lin
"settings" : {
"index" : {
"number_of_shards" : 2,
"number_of_replicas" : 1
}
},
"mappings" : {
"user" : { #user理解成表
"properties" : {
"name" : { #name是user表下的一列
"type" : "text", #text是name的数据类型
"analyzer" : "ik_smatrt" #指定分词的类型
}
}
}
}
}
出现如下图,表示成功
数据类型有:
- 字符型:text(默认分词、text.keyword不分词)keyword(不分词)
- 数值:long:64位存储,integer:32位存储,short:13位存储,byte:8位存储,double:64位双精度存储,float:32位单精度存储
- 日期:date,可以指定格式
-
Boolean:boolean false="false","off","no","0",""
分词器分类:
- 标准分词器(StandardardAnalyzer,默认分词策略)
- 简单分词器(SimpleAnalyzer)
- 空格分词器(WhitespaceAnalyzer)
- 语言分词器(LanguageAnalyzers)
- 自定义分词器
Elasticsearch提供的默认分词器策略"StandardAnalyzer"不支持中文分词,因此如果要实现中文全文检索的功能,需要配置中文分词,如ik分词器
3.查询索引
语法:
get 索引
示例:
get lin
4.删除索引
语法:
delete 索引名称
示例:
delete lin
5.创建文档
语法:
PUT /索引名称/类型名称/文档ID
{
"fied_name":"field_value",
...
}
示例:
put /lin/user/1
{
“name”:"张三"
}
1.使用POST方法,如果在添加文档时不指定文档ID,Elasticsearchk可以自动生成ID
2.如果在新增document时,index中没有定义任何type,则系统会首先新增对应type,然后在改type下新增对应的document
6.修改文档
示例:
put /lin/user/1
{
"name":"李四"
}
7.数据查询
语法:
get /索引名称/类型名称/文档ID
示例:
get /lin/user/1
8.删除文档
语法:
delete /索引名称/类型名称/文档ID
示例:
delete /lin/user/1
9.请求方式
请求方式分为以下几种:
- GET:数据查询
- POST:数据查询、数据新增、数据修改
- PUT:数据新增、数据修改
- DELETE:数据删改
10.空查询
搜索所有的索引和类型
示例:
get /_search
get /_search?timeout=10ms #10s 10m等
took:数值告诉我们执行这次搜索请求所耗费的时间有多少毫秒
timed_out:数值告诉我们查询是否超市
_shards:告诉我们参与查询分片的total总数,以及有多少successful、failed
hits:数组里则会包含前十个匹配文档——也就是搜索结果,里面有total总数量,分数和数据集合。
11.指定索引查询、指定类型查询
语法:
gei /索引//类型
示例:
get lin/user/_search
12、查询字句
match子句全文检索
term自居精准查询
range子句范围查询
示例:
13.组合查询分页
bool子句说明:
- must:文档必须匹配这些条件才能被包含进来
- must_not:文档必须不匹配这些条件才能被包含进来
- should:使用文档满足should内的条i按,将为该文档增加_score,否则无任何影响
- filter:使用过滤模式来进行查询
sort排序说明
示例:
java调用Elasticsearch
1.创建索引
导入jar包
<!---依赖版本号要和安装的E1asticsearch版本号一致-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
创建客户端
//设置集群名称
Settings settings Settings bui dero. put("cluster name","lasticsear ch-application"). build
//设置ip和端口号
Transportclient client=new PreBuiltTransportclient(settings).addTransportAddress (new TransportAddr ess (InetAddress getByName( 192. 168.83.99), 9300));
设置索引名称,并配置索引信息
client admin. indices. preparecreate("lin2"). get();
//配置类型名称、字段名、类型
client admin().indices().preparePutMapping ("lin2").get();
.setType ("user")
.setSource("{\n"+
" \"properties": (\n"+
" \"name":(n"+
" \"type\":\"text\"\n"+
" }\n"+
" \n"+
"}",XContentType.JSON).get();
关闭客户端
client.close();
2.查询数据
导入jar包
<!---依赖版本号要和安装的E1asticsearch版本号一致-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
创建客户端
//设置集群名称
Settings settings Settings bui dero. put("cluster name","lasticsear ch-application"). build
//设置ip和端口号
Transportclient client=new PreBuiltTransportclient(settings).addTransportAddress (new TransportAddr ess (InetAddress getByName( 192. 168.83.99), 9300));
设置条件检索
//设置索引
SearchRequestBuilder searchRequestBuilder= client,prepar esearch("dm");
//全文件检索
searchRequestBuilder.setquery(QueryBuilders.matchQuery ("itemName",2018));
//精准查询
//searchRequestBuilder.setQuery(QueryBuilders termQuery("itemTypeId1", "1"));
接受结果集
//接受查询数据
SearchResponse response = searchRequestBuilder.execute().actionGet():
Sear chHits searchIts = response.getHits();
Sear chHit[] hits = searchHits.getHits():
List result = null;
if(hits != nu11){
result = new Arraylist:
for (Sear chHit hit : hits) {
String json =hit. getSourceAsString();
System. out. printIn(json)
}
}
client. close();
完