B081-Lucene+ElasticSearch

目录

      • 认识全文检索
        • 概念
        • lucene原理
        • 全文检索的特点
        • 常见的全文检索方案
      • Lucene
        • 创建索引
          • 导包
          • 分析图
          • 代码
        • 搜索索引
          • 分析图
          • 代码
      • ElasticSearch
        • 认识ElasticSearch
        • ES与Kibana的安装及使用说明
        • ES相关概念理解和简单增删改查
        • ES查询
          • DSL查询
          • DSL过滤
        • 分词器
          • IK分词器
            • 安装
            • 测试分词器
          • 文档映射(字段类型设置)
            • ES字段类型
            • 默认映射
            • kibana
        • Java操作ES
          • 导入依赖
          • crud实现

认识全文检索

概念

对非结构化数据的搜索就叫全文检索,狭义的理解主要针对文本数据的搜索。

非结构化数据:
没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等。
非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等等

理解:可以理解为全文检索就是把没有结构化的数据变成有结构的数据,然后进行搜索,因为有结构化的数据通常情况下可以按照某种算法进行搜索。

lucene原理

在这里插入图片描述
在这里插入图片描述

全文检索的特点

相关度最高的排在最前面,官网中相关的网页排在最前面; java
关键词的高亮。
只处理文本,不处理语义。 以单词方式进行搜索
比如在输入框中输入“中国的首都在哪里”,搜索引擎不会以对话的形式告诉你“在北京”,而仅仅是列出包含了搜索关键字的网页。

常见的全文检索方案

全文搜索工具包-Lucene(核心)
全文搜索服务器 ,Elastic Search(ES) / Solr等封装了lucene并扩展

Lucene

创建索引

导包
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>5.5.0</version>
</dependency>
分析图

在这里插入图片描述

代码
    //创建索引@Testpublic void testCreateIndex() throws Exception {// 准备原始数据String doc1 = "hello world";int id1 = 1;String doc2 = "hello java world";int id2 = 2;String doc3 = "lucene world";int id3 = 3;//把数据变成Document对象Document d1 = new Document();d1.add(new TextField("context",doc1, Field.Store.YES));// 存储列的名字;存储的数据;是否要存储原始数据d1.add(new IntField("id", id1, Field.Store.YES));Document d2 = new Document();d2.add(new TextField("context",doc2, Field.Store.YES));d2.add(new IntField("id", id2, Field.Store.YES));Document d3 = new Document();d3.add(new TextField("context",doc3, Field.Store.YES));d3.add(new IntField("id", id3, Field.Store.YES));//准备索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));Analyzer analyzer = new SimpleAnalyzer();//配置信息,添加分词器IndexWriterConfig conf = new IndexWriterConfig(analyzer);//创建IndexWriter,创建索引IndexWriter indexWriter = new IndexWriter(directory,conf);//使用IndexWriter创建索引indexWriter.addDocument(d1);indexWriter.addDocument(d2);indexWriter.addDocument(d3);//提交创建indexWriter.commit();indexWriter.close();System.out.println("创建索引完成.......");}

搜索索引

分析图

在这里插入图片描述

代码
    //搜索索引@Testpublic void testSearchIndex() throws Exception {//索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));IndexReader indexReader = DirectoryReader.open(directory);//创建indexSearch 搜索索引IndexSearcher indexSearcher = new IndexSearcher(indexReader);//Term(String fld, String text) 要查询哪个字段,查询什么内容TermQuery query = new TermQuery(new Term("context", "hello"));//query:查询的条件   n:查多少条TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("命中的条数:"+topDocs.totalHits);//列表结果,带有分数ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {//文档分数float score = scoreDoc.score;//文档idint docID = scoreDoc.doc;//根据id获取文档Document doc = indexSearcher.doc(docID);System.out.println("id = "+doc.get("id")+" , score = "+score+" ,context = "+doc.get("context"));}}

ElasticSearch

认识ElasticSearch

见文档

ES与Kibana的安装及使用说明

见文档
Kibana可视化管理工具,相当于navicat,

ES相关概念理解和简单增删改查

在这里插入图片描述

#  添加数据       ---用户自己维护文档id
PUT pethome/user/5
{"id":5, "name": "wenda", "age":20,"size":170, "sex":1
}#  添加数据       ---ES自动维护文档id AYpOuIdMNmSVfcreiYqz
POST pethome/user/
{"id":2, "name": "wenda", "age":20,"size":170, "sex":1
}# 查询单条
GET pethome/user/1
GET pethome/user/AYpOuIdMNmSVfcreiYqz# 修改 全量修改
PUT pethome/user/1
{"id":1, "name": "wendaxi", "age":21,"sex":0
}# 修改  局部
POST pethome/user/1/_update
{"doc":{"name": "wenda", "age":24}
}#  删除
DELETE pethome/user/AYpOuIdMNmSVfcreiYqz#  获取多个数据结果
GET pethome/user/_mget
{"ids":[1,"AYpOuIdMNmSVfcreiYqz"]
}#  空搜索
GET _search#  分页
GET pethome/user/_search?size=2&from=2#  带条件分页
GET pethome/user/_search?q=age:20&size=2&from=2

ES查询

DSL查询

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

# 查询名字叫做wenda,size在160-180之间,sex为1,
# 按照id升序排序 查询第一页 的数据 每页3条# 排序分页
GET pethome/user/_search
{"size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}#  加入查询条件
#  match 相当于模糊查询(分词查询)
GET pethome/user/_search
{"query": {"match": {"name": "wenda"}}, "size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}
DSL过滤

DSL过滤 查询文档的方式更像是对于我的条件“有”或者“没有”,–精确查询
而DSL查询语句则像是“有多像”。–类似于模糊查询

DSL过滤和DSL查询在性能上的区别 :
过滤结果可以缓存并应用到后续请求。
查询语句同时 匹配文档,计算相关性,所以更耗时,且不缓存。
过滤语句 可有效地配合查询语句完成文档过滤。

# 工作中少用like全表扫描,会让索引失效
# where name like '%y%' and age=18 
# where age=18 and name like "%y%" (快)
# 先精确匹配 把结果缓存用于后续的查询
# DSL过滤-------相当于精确查找
GET pethome/user/_search
{"query": {"bool": {"must": [{"match": {"name": "wenda"}}],"filter": [{"term": {"age": "20"}},{"range": {"size": {"gte": 160,"lte": 170}}}]}}, "size": 2,"from": 0,"sort": [{"id": {"order": "asc"}}]
}

分词器

单字,双字,庖丁,IK

IK分词器
安装

先关闭ES与Kibana,然后解压elasticsearch-analysis-ik-5.2.2.zip文件,并将其内容放置于ES根目录/plugins/ik

测试分词器
POST _analyze
{"analyzer":"ik_smart","text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
文档映射(字段类型设置)

ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。

ES字段类型
① 基本字段类型
字符串:text(分词),keyword(不分词)   StringField(不分词文本),TextFiled(要分词文本)text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
{user:{“key”:value}}
{hobbys:[xxx,xx]}
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
默认映射

查看索引类型的映射配置:GET {indexName}/_mapping/{typeName}
ES在没有配置Mapping的情况下新增文档,ES会尝试对字段类型进行猜测,并动态生成字段和类型的映射关系。
在这里插入图片描述

kibana
GET pethome/user/_mappingPOST pethome/employee2/_mapping
{"employee2": {"properties": {"id": {"type": "long"},"username": {"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"},"password": {"type": "keyword"}}}
}GET pethome/employee2/_mapping

Java操作ES

导入依赖
	<dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.7</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.7</version></dependency>
crud实现
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;public class ESTestNew {//创建ES的客户端对象public static TransportClient getClient(){TransportClient client = null;try {client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));} catch (UnknownHostException e) {e.printStackTrace();}return client;}@Testpublic void testAddIndex(){TransportClient client = getClient();for (int i = 0; i < 50; i++) {IndexRequestBuilder builder = client.prepareIndex("pethome", "wxuser", String.valueOf(i));Map<String, Object> map = new HashMap<>();// 添加数据map.put("id",i);map.put("name","玛利亚"+i);map.put("age",18+i);map.put("sex",i%2);map.put("size",150+i);map.put("intro","haha"+i);builder.setSource(map);// 执行创建builder.get();}// 关闭资源client.close();}@Testpublic void testUpdate(){TransportClient client = getClient();// 指定要执行的操作对象UpdateRequestBuilder builder = client.prepareUpdate("pethome", "wxuser", String.valueOf(0));Map<String, Object> map = new HashMap<>();map.put("id",0);map.put("name","玛利亚000");map.put("age",18);map.put("sex",0);map.put("size",155);map.put("intro","haha000");builder.setDoc(map).get();client.close();}@Testpublic void testDel(){TransportClient client = getClient();DeleteRequestBuilder builder = client.prepareDelete("pethome", "wxuser", String.valueOf(0));builder.get();client.close();}@Testpublic void testQuery(){TransportClient client = getClient();SearchRequestBuilder builder = client.prepareSearch("pethome");builder.setTypes("wxuser");// 指定查询那个文件类型builder.setFrom(0);//起始位置builder.setSize(5);//每页条数builder.addSort("id", SortOrder.ASC);//设置排序// 添加筛选条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("name","玛利亚"));boolQuery.filter(QueryBuilders.termQuery("sex",1));boolQuery.filter(QueryBuilders.rangeQuery("size").gte(150).lte(180));SearchResponse response = builder.setQuery(boolQuery).get();SearchHits hits = response.getHits();System.out.println(hits.getTotalHits());SearchHit[] searchHits = hits.getHits();for (SearchHit searchHit : searchHits) {System.out.println(searchHit.getSource());}client.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点&#xff08;能跳转、能高亮&#xff09;声明式导航-两个类名定制两个高亮类名 实现导航高亮&#xff0c;实现方式其实&#xff0c;css&#xff0c;JavaScript , Vue ,都可以实现。其实关于路由导航&…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…

苹果macOS 14开发者预览版Beta 7发布 新增超过100款视频壁纸和屏保

8 月 31 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 苹果发布 Beta 7 更新的同时&#xff0c;还发布了第 6 个公测版&#xff0c;正式版…

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…

IP子网的划分

文章目录 一、子网掩码1. 产生背景2. 定义3. 分类 二、VLSM算法1. 得出下列参数2. 计算划分结果3. 举例子计算 三、常见子网划分对应关系四、练习IP编址题目需求解题1. 192.168.1.100/282. 172.16.0.58/263. 25.83.149.222/254. 100.100.243.18/205. 10.100.100.100/10 首先可以…

代码随想录笔记--栈与队列篇

目录 1--用栈实现队列 2--用队列实现栈 3--有效的括号 4--删除字符串中的所有相邻重复项 5--逆波兰表达式求值 6--滑动窗口的最大值 7--前k个高频元素 1--用栈实现队列 利用两个栈&#xff0c;一个是输入栈&#xff0c;另一个是输出栈&#xff1b; #include <iostrea…

NodeJS的简介以及下载和安装

本章节会带大家下载并安装NodeJs 以及简单的入门&#xff0c;配有超详细的图片&#xff0c;一步步带大家进行下载与安装 NodeJs简介关于前端与后端Node是什么&#xff1f;为什么要学习NodeNodeJS的优点&#xff1a; NodeJS的下载与安装NodeJS的下载&#xff1a; NodeJS的快速入…

剑指 Offer 49. 丑数(C++实现)

剑指 Offer 49. 丑数https://leetcode.cn/problems/chou-shu-lcof/ 对每个丑数 分别乘2、乘3、乘5 即可得到后续丑数 其中只需要对计算出来的丑数结果进行去重即可 int nthUglyNumber(int n) {// base caseif (n < 1){return -1;}if (n 1){return 1;}vector<int> res…

记1次前端性能优化之CPU使用率

碰到这样的一个问题&#xff0c;用户反馈页面的图表一直加载不出来&#xff0c;页面还卡死 打开链接页面&#xff0c;打开控制台 Network 看到有个请求一直pending&#xff0c;结合用户描述&#xff0c;页面一直loading,似乎验证了我的怀疑&#xff1a;后端迟迟没有相应。 但是…

LINQ详解(查询表达式)

什么是LINQ&#xff1f; LINQ(语言集成查询)是将查询功能直接集成到C#中。数据查询表示简单的字符串&#xff0c;在编译时不会进行类型检查和IntelliSense(代码补全辅助工具)支持。 在开发中&#xff0c;通常需要对不同类型的数据源了解不同的查询语句&#xff0c;如SQL数据库…

Redis项目实战——商户查询缓存

目录 为什么要用Redis实现商户查询缓存&#xff1f;用Redis实现商户查询缓存的基本思路&#xff1f;使用Redis缓存的问题及解决方法&#xff1f;一、如何保持数据库数据和Redis缓存数据的一致性&#xff1f;1 内存淘汰机制2 超时剔除机制3 主动更新机制&#xff08;胜&#xff…

sql:SQL优化知识点记录(七)

&#xff08;1&#xff09;索引优化5 &#xff08;2&#xff09;索引优化6 &#xff08;3&#xff09;索引优化7 查询*&#xff0c; 百分号加右边&#xff0c;否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引&#xff1a; 建立索引 id是主键&#xff0c;他也…

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…

WPF实战项目十三(API篇):备忘录功能api接口、优化待办事项api接口

1、新建MenoDto.cs /// <summary>/// 备忘录传输实体/// </summary>public class MemoDto : BaseDto{private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title value; OnPropertyChanged();…

python爬虫-数据解析BeautifulSoup

1、基本简介 BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器&#xff0c;主要功能也是解析和提取数据。 BeautifulSoup和lxml类似&#xff0c;既可以解析本地文件也可以响应服务器文件。 缺点&#xff1a;效率没有lxml的效率高 。 优点&#xff1a;接口设…

实现跨境电商测评和采退、LU卡、LU货最安全的系统方案

首先你要有一个稳定的测评环境系统&#xff0c;这个是做自养号退款、撸货、撸卡的基础。测评环境系统有很多&#xff0c;从早期的虚拟机&#xff0c;模拟机&#xff0c;云手机&#xff0c;VPS等等。这些系统方案先不说成本高&#xff0c;最重要的是成功率很低&#xff0c;所以一…

openGauss学习笔记-57 openGauss 高级特性-并行查询

文章目录 openGauss学习笔记-57 openGauss 高级特性-并行查询57.1 适用场景与限制57.2 资源对SMP性能的影响57.3 其他因素对SMP性能的影响57.4 配置步骤 openGauss学习笔记-57 openGauss 高级特性-并行查询 openGauss的SMP并行技术是一种利用计算机多核CPU架构来实现多线程并行…

Benchmarking Chinese Text Recognition: Datasets, Baselines| OCR 中文数据集【论文翻译】

基础信息如下 https://arxiv.org/pdf/2112.15093.pdfhttps://github.com/FudanVI/benchmarking-chinese-text-recognition Abstract 深度学习蓬勃发展的局面见证了近年来文本识别领域的迅速发展。然而&#xff0c;现有的文本识别方法主要针对英文文本。作为另一种广泛使用的语…

企业架构LNMP学习笔记3

服务器基本环境配置&#xff1a; 1、安装虚拟机&#xff0c;centos7.9 操作系统&#xff1b; 2、网络配置&#xff1b; 3、机器名FQDN设置&#xff1b; 4、DNS解析设置&#xff0c;本地hosts设置&#xff1b; 5、配置yum源环境&#xff1b; 6、vim安装配置&#xff1b; …