Solr进阶

Solr的使用

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)也可以显著的提升性能
  • 调优参数:通过调整各种配置参数,如合并策略,刷新间隔等,可以进一步的优化性能
2. solr如何使用,集成
2.1 安装solr
下载solr:

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

启动solr

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

创建核心(core)

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

2.2 配置solr
配置schema:

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

配置solrconfig.xml

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

调整其他配置:

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

2.3 使用solr
索引数据:

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

bash 复制代码
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请求来执行搜索查询

bash 复制代码
curl "http://localhost:8983/solr/mycore/select?q=*:*&wt=json&indent=true"
2.4 集成solr到应用程序

Java应用程序:

添加依赖:

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

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

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

Java 复制代码
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());
        }
    }
}
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):每个分面项在当前搜索结果中的出现次数。

例子解释

假设你有一个包含以下文档的索引:

sql 复制代码
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

如果你执行以下查询:

http 复制代码
GET /solr/mycore/select?q=*:*&facet=true&facet.field=category&wt=json

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

json 复制代码
{
  "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条结果

相关推荐
晨欣10 小时前
Elasticsearch和Lucene之间是什么关系?(ChatGPT回答)
elasticsearch·chatgpt·lucene
极梦网络无忧14 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
程序猿小D5 天前
第三百零二节 Lucene教程 - Lucene搜索文件
java·数据库·sql·搜索引擎·全文检索·mybatis·lucene
緑水長流*z5 天前
Lucene的概述与应用场景(1)
java·数据库·mysql·elasticsearch·solr·lucene·倒排索引
緑水長流*z5 天前
Lucene的使用方法与Luke工具(2)
java·elasticsearch·搜索引擎·全文检索·solr·lucene·倒排索引
花千树-0106 天前
深入探讨 Tantivy 及其在 Milvus 中的应用:倒排索引库对比与选择
elasticsearch·全文检索·lucene·milvus·es
程序猿小D6 天前
第三百零七节 Log4j教程 - Log4j日志格式、Log4j日志到文件
数据库·sql·log4j·全文检索·mybatis·lucene
shiming88797 天前
Lucene数据写入流程
java·mybatis·lucene
程序猿小D7 天前
第三百零一节 Lucene教程 - Lucene索引文件
java·服务器·sql·全文检索·mybatis·lucene·1024程序员节
bigbig猩猩7 天前
Lucene数据写入流程
java·mybatis·lucene