Elasticsearch全⽂检索

news2024/9/22 23:37:57

以下说明:其中比喻都是以mysql为模板进行比较说明 

一.lucene

  1.jar包环境准备

   <!-- 引入Lucene核心包及分词器包 -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>4.10.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>4.10.3</version>
        </dependency>
       <!-- IK中文分词器 -->
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
        </dependency>
3. 将项⽬⾃动⽣成的 application.properties ⽂件后缀改为 yml 类型。并添加数据库连接配置。
server:
  port: 9000
Spring:
  application:
    name: yx-lucene
  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/es_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: 123
# 开启驼峰命名匹配映射
mybatis:
  configuration:
    map-underscore-to-camel-case: true

二。代码如下

package com.example.demo.test;

import com.example.demo.pojo.JobInfo;
import com.example.demo.sercice.JobInfoService;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;
import java.io.IOException;
import java.util.List;
@SpringBootTest
public class LuceneTests {
 @Autowired
 private JobInfoService jobInfoService;
 @Test
 public void createIndex() throws IOException {
 // 1.指定索引⽂件存储的位置
 Directory directory = FSDirectory.open(new File("C:\\Users\\Lenovo\\Desktop\\java的复习\\四阶段\\Elasticsearch课前资料\\文档"));
 // 2.配置版本和分词器
// Analyzer analyzer = new StandardAnalyzer(); // 标准分词器默认提供的
  IKAnalyzer analyzer = new IKAnalyzer(); //中文的Ik分词器
  IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,analyzer);
 // 3.创建⼀个⽤来创建索引的对象IndexWriter
  //参数1:表示索引文件的目标位置,参数2表示按哪个分词器写出数据
 IndexWriter indexWriter = new IndexWriter(directory,config);
 indexWriter.deleteAll(); // 先删除索引
 // 4.获取原始数据
 List<JobInfo> jobInfoList = jobInfoService.selectAll();
 // 有多少的数据就应该构建多少lucene的⽂档对象document
 for (JobInfo jobInfo : jobInfoList) {
 Document document = new Document();
 // 域名、值、源数据是否存储 Yes表示永久在索引库中存储,No:表示不永久保存
 document.add(new LongField("id", jobInfo.getId(), Field.Store.YES));
 document.add(new TextField("companyName", jobInfo.getCompanyName(), Field.Store.YES));
  document.add(new TextField("companyAddr", jobInfo.getCompanyAddr(), Field.Store.YES));
  document.add(new TextField("companyInfo", jobInfo.getCompanyInfo(), Field.Store.YES));
  document.add(new TextField("jobName", jobInfo.getJobName(), Field.Store.YES));
  document.add(new TextField("jobAddr", jobInfo.getJobAddr(), Field.Store.YES));
  document.add(new TextField("jobInfo", jobInfo.getJobInfo(), Field.Store.YES));
  document.add(new IntField("salaryMin", jobInfo.getSalaryMin(), Field.Store.YES));
  document.add(new IntField("salaryMax", jobInfo.getSalaryMax(), Field.Store.YES));
  document.add(new StringField("url", jobInfo.getUrl(), Field.Store.YES));
  document.add(new StringField("time", jobInfo.getTime(), Field.Store.YES));
  // StringField不需要分词时使⽤,举例:url、电话号码、身份证号
  indexWriter.addDocument(document);
 }
  // 必须要关闭资源
  indexWriter.close();
 }

 @Test
 public void queryIndex() throws IOException {
  // 1.指定索引⽂件存储的位置
  Directory directory = FSDirectory.open(new File("C:\\Users\\Lenovo\\Desktop\\java的复习\\四阶段\\Elasticsearch课前资料\\文档"));
  // 2.创建⼀个⽤来读取索引的对象IndexReader
  IndexReader indexReader = DirectoryReader.open(directory);
  // 3.创建⼀个⽤来查询索引的对象IndexSearcher
  IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  // 使⽤term查询:指定查询的域名和关键字
  // 使⽤"北京"关键词搜索没有符合的结果
   Query query = new TermQuery(new Term("companyName", "北京"));
//   Query query = new TermQuery(new Term("companyName", "北"));
  // 第⼆个参数:最多显示多少条数据
  TopDocs topDocs = indexSearcher.search(query, 100);
  int totalHits = topDocs.totalHits;
  // 查询的总数量
  System.out.println("符合条件的总数:" + totalHits);
  System.out.println("maxScore="+topDocs.getMaxScore());
  ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  // 获取命中的⽂档,存储的是⽂档的id
  for (ScoreDoc scoreDoc : scoreDocs) {
   int docID = scoreDoc.doc; // 根据id查询⽂档
   Document document = indexSearcher.doc(docID);
   System.out.println( "id: " + document.get("id"));
   System.out.println( "companyName: " + document.get("companyName"));
   System.out.println( "companyAddr: " + document.get("companyAddr"));
   System.out.println( "jobName: " + document.get("jobName"));
   System.out.println("----------------------------------------------");
  }

 }
}

三.解析代码

 二.Kibana(重点)

使⽤Kibana对索引库操作

所有⽂档在写⼊索引前都将被分析,⽤户可以设置⼀些参数,决定如何将输⼊⽂本分割为词条,哪些词条应该被过滤掉,或哪些附加处理有必要被调⽤(⽐如移除HTML标签)。这就是映射扮演的⻆⾊,存储分析链所需的所有信息。Elasticsearch也是基于Lucene的全⽂检索库,本质也是存储数据,很多概念与MySQL类似的。对⽐关系:

settings:就是索引库设置,其中可以定义索引库的各种属性,⽬前我们可以不设置,都⾛默认。

索引库可以理解为mysql的数据库

1.使⽤Kibana创建索引库

PUT / 索引库名

查看索引库

GET请求可以帮我们查看索引信息,语法格式:

GET / 索引库名
查询 my_ip_addr 索引库中的数据。
GET /库名 / _search

删除索引库

删除索引使⽤ DELETE 请求。语法格式
DELETE / 索引库名

2.类型及映射操作(相当于对数据库中表的操作)

创建字段映射(创建表)

 属性描述如下

 查看映射关系 (换成mysql相当于获取到库里面所有表的字段信息)

GET / 索引库名 / _mapping
查看某个索引库中的所有类型的映射(相当于查询具体表的字段信息)
GET / 索引库名 / _mapping / 类型名

一次性创建索引库和类型

1.直接制定索引库中的类型, 基本语法⻅下:

 新增⽂档(表数据)

 1.新增⽂档(表数据)并随机⽣成id

2. 新增⽂档(表数据)并⾃定义id

 3.1查看文档(表数据)

GET /索引名(数据库名) /表名 /数据Id

3.2查看文档(表)所有数据

GET /索引名(数据库名)/表名/_source

4.修改数据

PUT 表示修改⽂档。不过修改必须指定 id 。分为以下两种情况:
如果 id 对应的⽂档存在,则修改。
如果 id 对应的⽂档不存在,则新增。

(这里想吐槽下,如果你不是随机生成ID的画直接用put来新增和修改,put岂不是能代替post) 

5.删除数据

删除使⽤ DELETE 请求,同样需要根据 id 进⾏删除。语法格式:
DELETE / 索引库名 / 类型名 / id
删除数据出错问题

 经查阅资料发现,此问题是由于ES数据存储磁盘剩余空间过少导致的。即ES存在⼀种flood_stage的机制。默认的 磁盘空间设置为95%,当磁盘占⽤超过此值阈值时,将会触发flood_stage机制,ES强制将各索引

index.blocks.read_only_allow_delete设置为true,即ES索引均被设置为仅允许只读只删,不允许新增。
2. 解决⽅法

1.kibana中执⾏以下命令。

PUT / yx / _settings
{
"index.blocks.read_only_allow_delete" : null
}

 说明:执⾏完以后,⽆需重启

2. 或者主机上直接执⾏如下命令。
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d
'{"index.blocks.read_only_allow_delete": null}'
curl - X PUT "localhost:9200/twitter/_settings?pretty" - H 'Content-Type:
application/json' - d '
{
"index.blocks.read_only_allow_delete" : null
}
'
说明:以上两种⽅式⼆选其⼀。

6.智能判断

刚刚我们在新增数据时,添加的字段都是提前在类型中定义过的,如果我们添加的字段并没有提前定义过,能够成 功吗?
事实上 Elasticsearch ⾮常智能,你不需要给索引库设置任何 mapping 映射,它也可以根据你输⼊的数据来判断类型,动态添加数据映射
在对 subTitle 字段做数据初始化的时候,设置的是字符串类型数据, ES ⽆法智能判断,它就会存⼊两种字段类型。
例如:
subtitle text 类型
subtitle.keyword keyword 类型
这种智能映射,底层原理是动态模板映射,如果我们想修改这种智能映射的规则,其实只要修改动态模板即可

7.动态模板

动态模板允许您更好地控制 Elasticsearch 如何在默认动态字段映射规则之外映射数据。通过将动态参数设置为 true 或runtime ,可以启⽤动态映射。然后,您可以使⽤动态模板定义⾃定义映射,这些映射可以应⽤于基于匹配条件 动态添加的字段
举例,我们可以把所有未映射的 string 类型数据⾃动映射为 keyword 类型

这样,未知的 string 类型数据就不会被映射为 text keyword 并存,⽽是统⼀以 keyword 来处理
附上以上代码
PUT ytr
{
 "mappings": {
 "goods": {
 "properties": {
 "title": {
 "type": "text",
 "analyzer": "ik_max_word"
 }
 },
 "dynamic_templates": [
 {
 "strings": {
 "match_mapping_type": "string",
 "mapping": {
 "type": "keyword",
 "index": false,
 "store": true
 }
 }
 }
 ]
 }
 }
}

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

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

相关文章

82、基于stm32单片机音乐喷泉设计播放器频谱彩灯系统设计(程序+原理图+参考论文+开题报告+任务书+设计资料+元器件清单等)

摘 要 随着人们生活水平的提高和建立绿色城市的向往&#xff0c;音乐喷泉以其独特的魅力和特殊的功能&#xff0c;愈来愈成为休闲娱乐产业中的一项重要产品,音乐喷泉的兴建也越来越多。 根据目前音乐喷泉的发展现状&#xff0c;介绍了一个以STM32单片机为核心的小型音乐喷泉控…

Fiddler过滤器 Filters 详解

目录 前言&#xff1a; 一、 Hosts 过滤 &#xff08;较常用&#xff09; 二、Client Process 过滤&#xff08;客户端进程过滤&#xff0c;通过配置只过滤/不过滤哪些进程的请求。用的不多&#xff09; 三、Request Headers &#xff08;根据请求头信息进行过滤。常用&…

wireshark抓包工具实战

目录 参考一、关于Wireshark二、下载及安装三、基本概念每层类型Ethernet以太网层&#xff08;MAC地址&#xff09;协议目的地址 Internet网络层协议报文 Transmission传输层协议 三、tcp抓包三次握手连接四次握手断开http协议请求协议包应答协议包文件类型 参考 网络抓包工具…

Docker容器技术 详解!!!

目录 一、概述 &#xff08;一&#xff09;docker介绍 &#xff08;二&#xff09;为什么使用Docker &#xff08;三&#xff09;docker优势 1、运行环境的一致性&#xff1a; 2、更快速地启动部署&#xff1a; 3、更好的隔离性&#xff1a; 4、弹性伸缩、快速扩展&…

FreeRTOS_任务切换

目录 1. RendSV 异常 2. FreeRTOS 任务切换场合 2.1 执行系统调用 2.2 系统滴答定时器&#xff08;SysTick&#xff09;中断 3. PendSV 中断服务函数 4. 查找下一个要运行的任务 4.1 通用方法 4.2 硬件方法 5. FreeRTOS 的时间片调度 6. 时间片调度实验 6.1 实验程序…

Pushgetway安装和使用

1、Pushgetway安装和使用 1.1 Pushgateway是什么 pushgateway 是另一种数据采集的方式&#xff0c;采用被动推送来获取监控数据的prometheus插件&#xff0c;它可以单独运行在 任何节点上&#xff0c;并不一定要运行在被监控的客户端。 首先通过用户自定义编写的脚本把需要监…

ClickHouse浅谈

文章目录 前置知识什么是OLAP与OLTP行式数据库与列式数据库什么是行式和列式&#xff1f;行式和列式的优缺点 ClickHouse什么是clickhouse&#xff1f;clickhouse的使用架构clickhouse的优点和缺点clickhouse的功能特性计算层服务层向量化引擎 clickhouse的使用案例与其他OLAP相…

如何打开远程电脑的任务管理器?

关于任务管理器 任务管理器可以显示远程计算机后台运行的进程和应用程序及其使用状态。通过任务管理器提供的信息&#xff0c;您可以了解是否有程序或进程占用过多的CPU和内存&#xff0c;然后您可以选择结束应用程序或结束进程以提高远程电脑的运行速度。 如何访问远程电脑上…

SD 系统自动计算的税额 有差异

SD 系统自动计算的税额 有差异 1,002,000.00 * 13% 115,274.34 产生了0.03的价格舍入差异 &#xff08;保存前是正确的&#xff0c;保存后产生差异&#xff09; 解决办法&#xff1a;取消条件类型组条件即可

辅助行走机器人开发 —— 下位机控制

文章目录 总体设计硬件选型控制模式程序流程1 初始化2 FreeRTOSBalance_taskMPU6050_taskShow_taskLed_taskPs2_taskData_task 3 中断串口中断 辅助行走机器人开发项目总结 总体设计 项目分为语音模式、导航模式和手动模式。 语音模式、导航模式为ROS下发控制指令&#xff1…

java.lang.UnsupportedOperationException 异常处理

通过 json 字符串转化成的 asList &#xff0c;对该 List 进行 add 时&#xff0c;抛出异常 java.lang.UnsupportedOperationException 处理方案 List string new ArrayList<>(asList);

企业邮箱的多重用途:了解企业邮箱在工作中的重要作用

邮箱已经成为商务交流不可或缺的一部分。在企业界&#xff0c;邮箱被用于各种各样的任务&#xff0c;从内部沟通到客户服务。虽然许多组织已经转向更现代的通信方式&#xff0c;如即时消息&#xff0c;企业邮箱仍然是任何成功的商业运作的重要组成部分。以下是公司邮箱的一些主…

【小程序上传报错】message:Error: 系统错误,错误码:80058,desc of scope.userLocation is empty

根据错误信息 “Error: 系统错误&#xff0c;错误码&#xff1a;80058,desc of scope.userLocation is empty”&#xff0c;这是一个系统错误&#xff0c;错误码为80058。错误信息中提到了 scope.userLocation 的描述为空。 可能是因为在小程序中使用了 scope.userLocation 权…

5.4 服务器编程基本框架和两种高效的事件处理模式

5.4 服务器编程基本框架和两种高效的事件处理模式 服务器编程基本框架 虽然服务器种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理&#xff08;比如开发Web服务器项目&#xff0c;浏览器客户端向服务端发送http请求&#xff0c;服务器对请求报文进行…

高压线路零序电流方向保护程序逻辑原理(三)

四、零序保护故障处理程序原理 零序保护逻辑程序可分为三个模块&#xff1a;快速动作部分、全相循环和非全相循环模块。这是根据零序保护的特点而设计的。任何一种高压线路保护都要求快速处理I段范围内的严重故障&#xff0c;所以零序保护与距离保护一样配有快速动作部分程序模…

分不清楚蝴蝶的种类,让AI来告诉你,基于YOLOv5开发构建轻量级蝴蝶细粒度目标检测识别系统

小时候有时间就很喜欢趁着下课放学的时间去抓蝴蝶玩&#xff0c;五彩多样的蝴蝶让人应接不暇&#xff0c;现在早就过了那个天真玩耍的年纪了&#xff0c;如今看到蝴蝶的第一反应就是这是什么蝴蝶&#xff0c;没有专业的知识支撑很难识别出来具体的种类&#xff0c;本文的主要目…

电脑bios使用的uefi启动,系统盘使用的mbr格式,为什么安装完系统无法进入?

概要 在电脑的安装系统过程中&#xff0c;我们会遇到一些问题&#xff0c;比如说使用UEFI启动但是磁盘分区使用MBR格式&#xff0c;导致系统安装完成之后无法引导。这是因为UEFI启动只支持GPT格式的磁盘分区。 在本文中&#xff0c;我们将探讨如何将磁盘转换成GPT格式&#xf…

一种新的程序在线升级的实现(学习)

介绍一种新的程序在线升级方法&#xff0c;以及程序在线升级在嵌入式系统中的应用和实现。设计将从系统原理和实现介绍该程序在线升级方法。利用串口作为通讯方式&#xff0c;自定义通讯协议。 上位机将升级文件传给下位机&#xff0c;下位机将数据解析后存储在内部Flash中。解…

用矩阵处理3D变换

Rotation 也可以把三个旋转矩阵合并为一个综合旋转矩阵: 平移和旋转结合 有时我们想要将平移和旋转结合起来&#xff0c;这样我们就可以在一次操作中同时进行两者&#xff0c;但是我们不能用3x3矩阵来做3D平移&#xff0c;只能用4x4矩阵来做&#xff0c;如下所定义&#xff1a…

尚硅谷Docker实战教程-笔记07【Docker常规安装简介】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】尚硅谷Docker实战教程-笔…