Solr进阶

devtools/2024/10/15 5:40:15/

Solr的使用

solr_1">1. solr的原理

Apache Solr 是一个基于Apache Lucene 的高性能全文索引服务器,提供了丰富的功能,如分布式搜索,索引赋值,负载均衡等,并且可以通过Http协议与应用程序进行交互。

1.1 架构

Solr的架构主要包括一下几个组件:

  • 客户端: 通过Http请求向solr发送查询或者更新请求
  • solr 节点: 处理来自客户端的请求,执行索引操作或者管理索引
  • Zookeeper: 在SolrCloud模式下,用于集群协调和服务发现
1.2 索引过程
  • 数据传输: 数据可以来自多种来源,如数据库,文件系统,Web服务等
  • 文档解析:solr接收到的数据会被解析成文档格式,每个文档包含多个字段,每个字段有其类型,如文本,日期,整数等
  • 分析器Analyzer: 文档中的文本字段会通过分析器处理,包括分词,去除停 用词,转换小写等步骤
  • 倒排索引构建: 经过分析后的文档会被存储在倒排索引中,倒排索引是一种数据结构,它将文档中的单词映射到包含这些单词的文档列表
  • 提交: 当索引操作完成时,需要显示的提交更改,以便新添加或者修改的文档被搜索到
1.3 搜索过程
  • 查询解析: 客户端发送的查询字符串会被solr解析成内部表示形式
  • 查询处理(query parser ):根据查询字符串和配置的查询处理器生成查询对象
  • 匹配倒排索引:solr使用生成的查询对象去匹配倒排索引的数据
  • 评分和排序: 匹配到的文档会根据相关性算法进行评分,并且按照分数排序
  • 结果返回: Solr将查询结果以JSON或者xml的格式返回给客户端
1.4 分布式搜索
  • SolrCloud: solrCloud时solr分布式模式,使用Zookeeper来管理集群的状态
  • 分片(sharding): 索引被分割成多个分片,分布在不同的节点上,这样可以提高搜索性能并且实现水平扩张
  • 复制(replication): 每个分片可以有多个副本,提供高可用和容错能力
  • 路由:查询请求会被路由到相关的分片上,然后合并各个分片的结果
1.5 配置和管理:
  • Schema.xml: 定义了文档的结构,包括字段及其类型
  • solrconfig.xml: 包含了solr的配置信息,如请求处理器,缓存设置,插件配置等
  • 管理界面:solr提供了一个Web管理界面,用户可以通过这个界面来进行管理和监控solr实例
1.6 性能优化
  • 缓存: solr支持多种类型的缓存,如过滤器缓存,查询结果缓存等来提高响应速度
  • 硬件资源:适当的硬件资源配置(如更多的内存,更快的磁盘IO)也可以显著的提升性能
  • 调优参数:通过调整各种配置参数,如合并策略,刷新间隔等,可以进一步的优化性能
solr_33">2. solr如何使用,集成
solr_34">2.1 安装solr
solr_35">下载solr

从Apache solr的官网下载最新版本的solr,解压下载的文件到你选择的目录中

solr_37">启动solr

进入解压后的solr目录,启动solr服务器,在windows上运行bin\solr start,在Linux\Unix上运行 bin/solr start

创建核心(core)

核心是solr中的一个逻辑索引单元,你可以通过solr的管理界面或者命令行来创建核心。例如,通过命令行创建名为mycore的核心:bin/solr create -c mycore

solr_42">2.2 配置solr
配置schema:

server/solr/mycore/conf 目录下找到managed-schema文件(旧版可能是schema.xml),编辑这个文件来定义字段的类型,字段,以及他们的属性,如是否存储,是否索引等

solrconfigxml_45">配置solrconfig.xml

在同一目录下找到solrconfig.xml文件,配置请求处理器,缓存设置,插件等

调整其他配置:

根据需要调整其他配置文件,如solr.xmlzoo.cfg(如果使用solrCloud模式)

solr_50">2.3 使用solr
索引数据:

可以通过HTTP Post请求向solr发送文档进行索引,例如,使用curl命令

curl http://localhost:8983/solr/mycore/update -H "Content-Type: application/json" --data-binary '[{"id":"1", "title":"Example Document 1", "content":"This is the content of the first example document."},{"id":"2", "title":"Example Document 2", "content":"This is the content of the second example document."}
]' -X POST

提交更好:curl http://localhost:8983/solr/mycore/update?commit=true -X GET

执行搜索:

通过发送HTTP Get请求来执行搜索查询

curl "http://localhost:8983/solr/mycore/select?q=*:*&wt=json&indent=true"
solr_68">2.4 集成solr到应用程序

Java应用程序:

添加依赖:

如果你使用的是maven。可以在pom.xml中添加solr依赖

<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>8.11.1</version> <!-- 请根据实际情况更新版本号 -->
</dependency>
编写代码

创建solr客户端并且连接到solr服务端:

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.common.params.ModifiableSolrParams;public class SolrIntegration {public static void main(String[] args) throws Exception {// 创建 Solr 客户端String url = "http://localhost:8983/solr/mycore";try (SolrClient client = new HttpSolrClient.Builder(url).build()) {// 执行搜索ModifiableSolrParams params = new ModifiableSolrParams();params.set("q", "*:*");params.set("rows", 10);QueryResponse response = client.query(params);System.out.println(response.getResults());}}
}
solr_106">3. solr的语法
3.1 基本查询
Term Queries(术语查询)

用于查找包含特定词项的文档,如,content:solr 查询content 字段中包含solr的文档

Phrase Queries(短语查询)

用于查找包含特定短语的文档,如,content:"Apache solr"查找content字段中包含"Apache solr"短语的文档

Wildcard Queries(通配符查询)

支持单字符通配符 和多字符通配符* 。如,title:te?t 查找title字段中包含以te开头,后根任意一个字符,再根t的文档。 或者title:te*t ,表示查找title字段中包含以te开头,后根任意数量的字符,再根t的文档

Fuzzy Queries(模糊查询)

通过再词项末尾加上 ~ 来起订模糊匹配。如,title:roam~ 查找title字符中与roam类似的词项(如foam等)

Proximity Queries(邻近查询)

通过使用~ 后根数字来指定两个词项之间的最大距离。如,title:"Solr search"~3 表示查找title字段中“Solr” 和search之间最多相隔3个词的文档

Range Queries(范围查询)

用于查询字段值再某个范围内的文档。如,price:[10 to 100] 表示price字段再10到100之间的文档

Boolean Operation(布尔操作符)

AND OR NOT 用于组和多个查询条件,如,
title:solr AND content:search 表示查找同时包含solr和search的文档
title:solr OR content:search ,表示查找包含solr或者search的文档
title:solr NOT content:search 表示查找包含solr但不包含search的文档

Boosting a Term(提高词项权重)

通过再词项后面添加^ 和一个浮点数来提升该词项的权重。如,title:Solr^2 AND content:search 提升solr再结果中的权重

Field Grouping(字段分组)

通过{!field f= fieldName} 语法来指定查询的字段。如,{!field f=title}Solr 指定只在title字段中查找Solr

3.2 高级查询
Filter Queries(过滤查询fq)

用于在搜索结果上应用过滤条件,通常用于提升性能。如,q=*:*&fq=Category:books 表示查询所有的文档,并过滤出category为“books”的文档

Faceting(分面搜索)

用于对搜索结果进行统计分析。如,q=*:*&facet=true&facet.field=category 表示对所有的文档按照category字段进行分面统计

分面统计(Faceting)是一种数据聚合技术,它允许你对搜索结果进行多维度的统计分析。在搜索引擎中,分面统计通常用于提供结构化的导航和过滤选项,帮助用户快速缩小搜索范围并找到他们感兴趣的内容。

分面统计的基本概念
分面(Facet):一个分面是数据的一个特定维度或属性。例如,在电子商务网站上,产品类别、价格范围、品牌等都可以作为分面。
分面项(Facet Value):每个分面下的具体值。例如,如果 category 是一个分面,那么 “Books”、“Electronics” 和 “Clothing” 就是分面项。
分面计数(Facet Count):每个分面项在当前搜索结果中的出现次数。
例子解释
假设你有一个包含以下文档的索引:

id:1, title:Book A, category:Books, price:20
id:2, title:Book B, category:Books, price:30
id:3, title:Phone X, category:Electronics, price:500
id:4, title:Shirt Y, category:Clothing, price:50
id:5, title:Book C, category:Books, price:40

如果你执行以下查询:

GET /solr/mycore/select?q=*:*&facet=true&facet.field=category&wt=json

Solr 会返回所有文档,并对 category 字段进行分面统计。结果可能类似于:

{"response": {"numFound": 5,"start": 0,"docs": [{ "id": "1", "title": "Book A", "category": "Books", "price": 20 },{ "id": "2", "title": "Book B", "category": "Books", "price": 30 },{ "id": "3", "title": "Phone X", "category": "Electronics", "price": 500 },{ "id": "4", "title": "Shirt Y", "category": "Clothing", "price": 50 },{ "id": "5", "title": "Book C", "category": "Books", "price": 40 }]},"facet_counts": {"facet_queries": {},"facet_fields": {"category": ["Books", 3,"Electronics", 1,"Clothing", 1]},"facet_dates": {},"facet_ranges": {}}
}
Sorting(排序)

通过sort参数对结果进行排序。如,q=*:*sort=price asc,date desc 表示先按照price升序,再按照date降序排序

Highlight(高亮显示)

通过h1参数对匹配的文本进行高亮显示。如,q=Solr&h1=true&h1.fl=content 表示对content字段中的Solr进行高亮显示

Paging and Result Size (分页和结果大小)

通过startrows 参数控制分页。如,q=Solr&start=0&rows=10 表示获取第0到第9条结果


http://www.ppmy.cn/devtools/126003.html

相关文章

Java+Jenkins实现自动化打包部署流程

目录 jenkins简介 前置依赖 1. jdk17 2.apache maven 3.8.6 3.git 4.docker 5.下载jenkins 启动配置jenkins 优缺点对比 Jenkins 的优点&#xff1a; Jenkins 的缺点&#xff1a; jenkins简介 Jenkins 是一个开源的自动化服务器&#xff0c;可以用于自动化各种任务&…

网络知识点之—EVPN

EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面&#xff0c;利用BGP扩展协议来传递二层或三层的可达性信息&#xff0c;实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

【Jackson】实现 Java 中的 JSON 对象映射

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【Jackson】实现 Java 中的 JSON 对象映射&#xff0c;首先了解, Jackson 库是干啥的, 然后如何进行对象与 JSON 结构之间的序列化和反序列化的使用, 以及 Jackson 常用…

Nginx(Linux):服务器版本升级和新增模块

目录 1、概述2、使用Nginx服务信号完成Nginx升级2.1 备份当前版本的Nginx2.2 向服务器导入新的Nginx2.3 向服务器导入新的Nginx2.4 停止老版本Nginx 3、使用Nginx安装目录的make命令完成升级3.1 备份当前版本的Nginx3.2 向服务器导入新的Nginx3.3 执行更新命令 1、概述 如果想…

Docker 命令替代(ctr和 crictl)

1. ctr ctr 是 containerd 的一个客户端工具。 $ ctr -v ctr containerd.io 1.6.16从输出看到,这是一个 containerd 管理工具,一般是安装完 containerd.io 之后就有的命令。 现在 Containerd 也有 namespaces 的概念,所以很多操作需要加上 -n。默认情况下运行在 default …

vue判断对象数组里是否有重复数据

TOCvue判断对象数组里是否有重复数据 try {//通过产品编码赛选出新的数组 在比较let names this.goodsJson.map(item > item["productCode"]);let nameSet new Set(names)if (nameSet.size ! names.length) {this.$message({message: 警告&#xff01;产品选项…

layui table 自定义表头

自定义表头-查询 js/css静态文件引用 <!-- 引入 layui.css --> <link href"//unpkg.com/layui2.9.16/dist/css/layui.css" rel"stylesheet"> <!-- 引入 layui.js --> <script src"//unpkg.com/layui2.9.16/dist/layui.js"…

Flask接口通过WSGI服务器部署到后台

1、flask开发服务器警告问题 &#xff08;1&#xff09;flask直接部署警告问题 flask接口直接部署会出现下列警告&#xff1a;WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. 例如&#xff1a; 这条…