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条结果

相关推荐
cyh男3 天前
lucene中AutomatonQuery类的作用
lucene
cyh男3 天前
lucene中的PointRangeQuery和PointInSetQuery有什么区别
lucene
cyh男3 天前
为什么ES中不推荐使用wildcard查询
elasticsearch·lucene
渣渣盟5 天前
中文分词技术全解析
搜索引擎·全文检索·lucene
cyh男17 天前
lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比
lucene
cyh男19 天前
Lucene 8.7.0 版本中dvd、dvm文件详解
lucene
是犹橐籥19 天前
头歌Educoder答案 Lucene - 全文检索入门
搜索引擎·全文检索·lucene
cyh男20 天前
Lucene 8.7.0 版本中docFreq、totalTermFreq、getDocCount等方法的含义
lucene
李白你好21 天前
Solr任意文件读取-快速利用工具
solr
cyh男21 天前
Lucene 8.7.0 版本中doc、tim、tip、tmd文件详解
lucene