B081-Lucene+ElasticSearch

news2024/9/20 8:04:45

目录

      • 认识全文检索
        • 概念
        • 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>
分析图

在这里插入图片描述

代码
    //创建索引
    @Test
    public 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("创建索引完成.......");
    }

搜索索引

分析图

在这里插入图片描述

代码
    //搜索索引
    @Test
    public 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;
            //文档id
            int 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/_mapping

POST 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;
    }

    @Test
    public 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();
    }

    @Test
    public 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();
    }

    @Test
    public void testDel(){
        TransportClient client = getClient();
        DeleteRequestBuilder builder = client.prepareDelete("pethome", "wxuser", String.valueOf(0));
        builder.get();
        client.close();
    }

    @Test
    public 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.coloradmin.cn/o/960143.html

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

相关文章

火热报名中 | 网安朝阳·西门子白帽黑客大赛燃爆来袭

2022年 首届西门子白帽黑客大赛 集结全国网安精英 以热爱之名 引爆整个夏天 2023年 网安朝阳西门子白帽黑客大赛—— 国际精英挑战赛 再度重磅归来 网安骑士的荣耀角斗场 等你来战 赛宁网安持续为第二届赛事 提供全程服务支持 热血战役 即将打响 报名通道现已开启…

风险评估

风险评估概念 风险评估是一种系统性的方法&#xff0c;用于识别、评估和量化潜在的风险和威胁&#xff0c;以便组织或个人能够采取适当的措施来管理和减轻这些风险。 风险评估的目的 风险评估要素关系 技术评估和管理评估 风险评估分析原理 风险评估服务 风险评估实施流程

SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)

1.SQLAlchemy是什么&#xff1f; SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM&#xff0c;开发者可以用面向对象的方式来操作数据库&#xff0c;不再需要编写 SQL 语句。 SQLAlchemy 支持多种数据库&#xff0c;除 sqlite 外&#xff0c;其它数据库需要安装第三方驱动。…

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日&#xff0c;第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间&#xff0c;远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力&#xff0c;让我们…

景芯SoC 芯片全流程培训

【全网唯一】景芯SoC是一款用于芯片全流程培训的低功耗ISP图像处理SoC&#xff0c;采用低功耗RISC-V处理器&#xff0c;内置ITCM SRAM、DTCM SRAM&#xff0c;集成包括MIPI、ISP、CNN、QSPI、UART、I2C、GPIO、百兆以太网等IP&#xff0c;采用SMIC40工艺设计流片。 培训数据包括…

云计算在智能制造中的应用与前景

文章目录 云计算的基本概念智能制造的基本概念云计算在智能制造中的应用1. 数据存储和管理2. 大数据分析3. 机器学习和预测维护4. 跨地理分布的协作5. 资源弹性和成本优化 未来前景1. 智能工厂2. 预测性维护3. 定制化生产4. 绿色生产5. 全球制造协作 结论 &#x1f389;欢迎来到…

QTday3(QT实现文件对话框保存操作、实现键盘触发事件【WASD控制小球的移动】)

1.实现文件对话框保存操作 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontBtn_clicked() {//调用QFo…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

Error:Java:无效的源发行版:14

问题描述&#xff1a;项目拉下来&#xff0c;跑的时候发现版本有问题。这个问题可好解决了&#xff0c;只需要看下面几个方面&#xff0c;然后让他们保持一致就OK了 step1&#xff1a;查看本地的jdk版本 打开cmd窗口&#xff0c;输入命令 java -version就可以查看到本地的jdk版…

dji uav建图导航系列(三)模拟建图、导航

前面博文【dji uav建图导航系列()建图】、【dji uav建图导航系列()导航】 使用真实无人机和挂载的激光雷达完成建图、导航的任务。 当需要验证某一个slam算法时,我们通常使用模拟环境进行测试,这里使用stageros进行模拟测试,实际就是通过模拟器,虚拟一个带有传感器(如…

如何一键批量查询全部物流信息?

在日常工作中&#xff0c;快递物流信息的查询是一项常规任务。然而&#xff0c;这个过程往往既耗时又费力&#xff0c;尤其是在面对大量单号的情况下。为了解决这个问题&#xff0c;我们推荐使用固乔快递查询助手&#xff0c;一款能够快速、准确地查询快递物流信息的软件。 首先…

【线程池】如何判断线程池中的任务执行完毕(三)

目录 前言 1. isTerminated()方法 2. awaitTermination()方法 3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用 4.使用CountDownlatch类 前言 通常我们使用线程池的时候&#xff0c;系统处于运行的状态&#xff0c;而线程池本身就是主要为了线程复用&…

CVE-2023-23752:Joomla未授权访问漏洞复现

CVE-2023-23752&#xff1a;Joomla未授权访问漏洞复现 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 一.Openfire简介 Joomla是一个免费的开源内容管理系统&#xff08;CMS&a…

Java for循环每次都通过list.size()和 string.length()获取大小性能

有人说在for循环之前用一个局部变量先获取到list.size()、str.length()&#xff0c;然后在for循环的判断条件里通过这个局部变量替换list.size()、str.length()会节省数据计算的时间。事实真的是这样吗&#xff1f;下面就为大家解答这个问题。 说明&#xff1a;此文章针对Andro…

打造成功的砍价营销大解析,销量飙升

砍价活动是吸引顾客的一种有效方式&#xff0c;可以帮助提高销量和提升品牌知名度。在乔拓云平台上&#xff0c;我们提供了一套简单易用的工具&#xff0c;让您能够轻松地制作一个成功的砍价活动。下面&#xff0c;我将详细介绍具体步骤&#xff0c;让您能够轻松上手。 第一步&…

港联证券|4%!央行宣布:降准!新股大涨138%,再现触发临停!

煤炭领涨两市&#xff0c;多股有望继续高份额分红。 沪指早间冲高后有所回落&#xff0c;上证50盘中一度涨超1%&#xff0c;保险、银行等大金融板块拉升。食品、乳业、白酒、零售等大消费板块全线拉升&#xff0c;半导体芯片股走低&#xff0c;泰凌微跌超10%&#xff0c;寒武纪…

8个神奇的UI设计工具,小白也可轻松上手

随着设计工作的不断发展&#xff0c;市面上好用的设计工具也丰富起来&#xff0c;今天本文共整理了8个好用的设计工具&#xff0c;可以充分满足设计师对设计工具使用的需求&#xff0c;接下来就一起来看看吧&#xff01; 1、即时设计 即时设计是一个面向个人设计师和中小型设…

考前冲刺上岸浙工商MBA的备考经验分享

2023年对于许多人来说都是不平凡的一年&#xff0c;历经三年的抗争&#xff0c;我们终于成功结束了疫情。而我也很幸运的被浙工商MBA项目录取&#xff0c;即将开始全新的学习生活。身为一名已在职工作6年的人&#xff0c;能够重回校园真是一种特别令人激动的体验。今天&#xf…

极致内卷的中国电商路在何方?

2023年上半年最大的价值在于终于找到了确定性&#xff1a;1&#xff0c;消费仍然在增长是确定的&#xff0c;只是增速不再那么高&#xff1b;2&#xff0c;必须从“流量”转向做“留量”是确定的&#xff0c;无论是互联网还是传统消费领域&#xff0c;所有企业都在强调做单客运…

游戏发行商能够提供什么服务?

游戏发行商可以为游戏开发者提供广泛的服务&#xff0c;以帮助他们将游戏成功地引入市场并取得更好的业绩。以下是游戏发行商可能提供的一些服务&#xff1a; 市场营销和宣传&#xff1a;发行商通常具有丰富的市场营销经验&#xff0c;可以制定并执行有效的宣传和营销策略。他们…