全文检索Elasticsearch

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",""


    K6KBT7GY$[GN_]O[]P)FH9D.png

    分词器分类:

  • 标准分词器(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包


 
       org.elasticsearch.client
       transport
       6.2.4


       org.elasticsearch
       elasticsearch
       6.2.4


       org.apache.httpcomponents
       httpclient
       4.5.3

创建客户端

//设置集群名称
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包


 
       org.elasticsearch.client
       transport
       6.2.4


       org.elasticsearch
       elasticsearch
       6.2.4


       org.apache.httpcomponents
       httpclient
       4.5.3

创建客户端

//设置集群名称
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();

你可能感兴趣的:(全文检索Elasticsearch)