全文检索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包

<!---依赖版本号要和安装的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();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容