solr中文
solr常用函数
solr常用函数Solr作为一款优秀的搜索引擎,可以通过常用函数来提高搜索效率和查询结果的准确性。
下面将介绍一些常见的Solr常用函数。
一、数值函数1. abs(x):返回x的绝对值;2. ceil(x):返回不小于x的最小整数;3. floor(x):返回不大于x的最大整数;4. log(x):返回以e为底,x的对数;5. sqrt(x):返回x的平方根;6. pow(x,y):返回x的y次方。
二、日期函数1. day(date):返回日期date的日;2. hour(date):返回日期date的小时;3. minute(date):返回日期date的分钟;4. month(date):返回日期date的月份;5. second(date):返回日期date的秒;6. year(date):返回日期date的年份;7. dateDiff(date1,date2):返回日期date1和date2之间的天数。
三、字符串函数1. concat(str1,str2,...):连接字符串;2. length(str):返回字符串的长度;3. lower(str):将字符串转换为小写;4. upper(str):将字符串转换为大写;5. replace(str,search,replace):将字符串中的search替换为replace;6. substring(str,start,length):返回从start位置开始,长度为length的子字符串。
四、条件函数1. if(condition,value1,value2):如果condition为真,则返回value1,否则返回value2;2. case(value1,result1,value2,result2,...,default):根据value的值返回对应的result,如果都不符合则返回default。
五、集合函数1. sum(x):返回集合x的总和;2. avg(x):返回集合x的平均值;3. max(x):返回集合x的最大值;4. min(x):返回集合x的最小值;5. count(x):返回集合x的元素个数;六、地理函数1. dist(geom1,geom2):返回geom1和geom2之间的距离;2. geodist(lat1,lon1,lat2,lon2):返回经纬度(lat1,lon1)和(lat2,lon2)之间的距离;3. bbox(geom):返回包含geom的矩形框;4. geofilt(field,lat,lon,dist):根据距离过滤结果;5. geodistfacet(field,lat,lon,queries):根据距离进行分组。
Solr的原理及使用
Solr的原理及使⽤1.Solr的简介Solr是⼀个独⽴的企业级搜索应⽤服务器,它对外提供类似于Web-service的API接⼝。
⽤户可以通过http请求,向搜索引擎服务器提交⼀定格式的XML⽂件,⽣成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
2.⼯作原理solr是基于Lucence开发的企业级搜索引擎技术,⽽lucence的原理是倒排索引。
那么什么是倒排索引呢?接下来我们就介绍⼀下lucence倒排索引原理。
假设有两篇⽂章1和2:⽂章1的内容为:⽼超在卡⼦门⼯作,我也是。
⽂章2的内容为:⼩超在⿎楼⼯作。
由于lucence是基于关键词索引查询的,那我们⾸先要取得这两篇⽂章的关键词。
如果我们把⽂章看成⼀个字符串,我们需要取得字符串中的所有单词,即分词。
分词时,忽略”在“、”的“之类的没有意义的介词,以及标点符号可以过滤。
我们使⽤Ik Analyzer实现中⽂分词,分词之后结果为:⽂章1:⽂章2:接下来,有了关键词后,我们就可以建⽴倒排索引了。
上⾯的对应关系是:“⽂章号”对“⽂章中所有关键词”。
倒排索引把这个关系倒过来,变成: “关键词”对“拥有该关键词的所有⽂章号”。
通常仅知道关键词在哪些⽂章中出现还不够,我们还需要知道关键词在⽂章中出现次数和出现的位置,通常有两种位置:a.字符位置,即记录该词是⽂章中第⼏个字符(优点是关键词亮显时定位快);b.关键词位置,即记录该词是⽂章中第⼏个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上出现频率和出现位置信息后,我们的索引结构变为:实现时,lucene将上⾯三列分别作为词典⽂件(Term Dictionary)、频率⽂件(frequencies)、位置⽂件 (positions)保存。
其中词典⽂件不仅保存有每个关键词,还保留了指向频率⽂件和位置⽂件的指针,通过指针可以找到该关键字的频率信息和位置信息。
solr score计算
solr score计算Solr是一个开源的全文搜索框架,广泛应用于各种类型的应用程序中。
在Solr 中,搜索结果的排序是通过计算每个搜索结果的得分(score)来实现的。
Solr的得分计算算法非常复杂,涉及到多种因素的权衡和计算。
本文将介绍一些常见的Solr Score计算的因素和算法。
1. 词频(Term Frequency,TF):词频指的是搜索关键词在文档中出现的频率。
Solr会根据关键词在文档中的出现次数给予较高的权重,出现频率越高的关键词得分越高。
2. 逆文档频率(Inverse Document Frequency,IDF):逆文档频率是指关键词在整个文档集合中的重要性。
Solr会根据关键词在整个文档集合中的出现频率给予较低的权重,出现频率较低的关键词得分较高。
3. 字段长度(Field Length):Solr会考虑字段的长度对得分的影响。
例如,较短的字段可能更加精确地匹配搜索关键词,因此会得到较高的分数。
4. 域权重(Field Boost):Solr允许为不同的字段赋予不同的权重。
通过调整字段的权重,可以影响搜索结果的排序。
例如,如果某个字段对于搜索关键词的匹配非常重要,可以给予该字段较高的权重。
5. 文档相关度(Document Relevance):Solr会根据搜索关键词在文档中的位置和顺序来计算得分。
出现在标题或开头部分的关键词可能与搜索意图更加相关,因此会得到较高的分数。
6. 准确度(Precision):Solr会根据搜索关键词的准确度来计算得分。
如果搜索关键词与文档中的内容非常接近,将得到较高的分数。
7. 字段匹配度(Field Matching):Solr会考虑搜索关键词与字段中的内容的匹配度。
如果搜索关键词完全匹配字段中的内容,将得到较高的分数。
除了上述因素,Solr还会考虑文档的权重、搜索关键词的顺序以及其他一些算法来计算得分。
总体而言,Solr的得分计算是基于多种因素的综合评估,旨在提供与搜索意图最相关的结果。
Solr开发指南
Solr全文检索技术1.Solr介绍 152.Solr安装配置-SolrCore配置 153.Solr安装配置-Solr工程部署 104.Solr安装配置-Solr工程测试 155.Solr安装配置-多SorlCore配置 106.Solr入门--schema 207.Solr入门-安装中文分词器 158.Solr入门-自定义业务系统Field 209.Solr入门-SolrJ介绍1010.Solr入门-SolrJ索引维护 2011.Solr入门-数据导入处理器2012.Solr入门-搜索语法 1013.Solr入门-SolrJ-搜索 2014.Solr案例-需求分析 1015.Solr案例-架构设计 1516.Solr案例-Service 2017.Solr案例-Controller 2018.Solr案例-主体调试 2019.Solr案例-功能完善1【Solr介绍】1.1S olr是什么Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引。
Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。
Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
1.2S olr与Lucene的区别Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。
solr语法
solr语法Solr是一个基于Lucene的开源搜索平台,支持全文检索、分布式搜索、多语言支持等功能。
Solr语法是指在Solr平台上执行搜索时所使用的查询语言,它可以帮助用户更加精确地定位到所需要的数据。
Solr语法主要包括以下几个方面:1. 查询语句:查询语句是Solr中最基本的语法,它用于指定要搜索的内容。
查询语句可以是一个单词或一个短语,也可以是一个复杂的逻辑表达式。
例如:- 查询单词:q=keyword- 查询短语:q="keyword1 keyword2"- 复杂逻辑表达式:q=(keyword1 AND keyword2) OR keyword32. 过滤器:过滤器用于对搜索结果进行过滤,可以根据指定条件过滤掉不符合条件的文档。
常用的过滤器包括范围过滤器、布尔过滤器、集合过滤器等。
例如:- 范围过滤器:fq=price:[10 TO 100]- 布尔过滤器:fq=is_published:true- 集合过滤器:fq=id:(1234 OR 5678)3. 排序:排序用于对搜索结果进行排序,可以根据指定字段对结果进行升序或降序排列。
例如:- 升序排序:sort=price asc- 降序排序:sort=price desc4. 分页:分页用于控制搜索结果的输出数量,可以指定每页输出多少条数据和从哪条数据开始输出。
例如:- 每页输出10条数据:rows=10- 从第20条数据开始输出:start=205. 字段选择:字段选择用于指定返回结果中包含哪些字段,可以提高搜索效率和减少网络传输量。
例如:- 返回title和content字段:fl=title,content- 排除id和score字段:fl=-id,-score以上就是Solr语法的主要内容,通过合理使用这些语法可以帮助用户更加准确地搜索到所需要的数据。
solr分词原理
solr分词原理
哎呀,你问到这solr分词原理,咱得好好给你说道说道。
说起这个,咱们得先从字儿说起。
你看,这字儿,每个都有它的意思,但放一块儿了,那意思就变了。
这solr分词,就是把这大段大段的文字,给切成一小段一小段的,好让人更容易理解。
咱们陕西话里有个词儿叫“割肉”,虽然跟这分词不是一回事儿,但那种感觉差不多。
就是把一大块儿东西,给切成小块儿,方便吃,也方便消化。
这solr分词啊,它有个特点,就是能识别出哪些是词,哪些是短语。
这就好比咱们四川人吃火锅,一眼就能看出哪些是菜,哪些是肉,哪些是调料。
分得清清楚楚,明明白白。
再说说它的原理吧,其实也不复杂。
就是根据一些规则,比如词的长度、词的频率,还有上下文关系,来把文字切成一小块一小块的。
这就好比咱们做菜,得根据食材的特性,还有口味需求,来决定怎么切,怎么炒。
总的来说,这solr分词原理,就是这么一回事儿。
它能把大段大段的文字,切成小块儿,方便我们理解和处理。
就像咱们做菜一样,得把食材切好,才能做出好吃的菜来。
哎呀,说了这么多,你明白了吧?这solr分词原理,其实也不难,就是得有点儿技巧和经验。
就像咱们做菜一样,得多练练手,才能做出好吃的菜来。
solr multivalued 字段定义
Solr是一个基于Lucene的开源搜索引擎,广泛应用于企业级搜索解决方案中。
在Solr 中,字段(Field)是构成文档(Document)的基本单位,用于存储和检索数据。
其中,multivalued字段是一种特殊类型的字段,允许在一个字段中存储多个值。
本文将详细介绍Solr中multivalued字段的定义、特性及使用场景,字数超过800字。
一、multivalued字段的定义在Solr中,multivalued字段允许存储多个值,这些值可以是字符串、数字、日期等类型。
与单值字段相比,multivalued字段更具灵活性,能够存储更复杂的数据结构。
定义一个multivalued字段时,需要在schema.xml文件中将字段的multiValued属性设置为true。
例如:php<field name="tags" type="string" indexed="true" stored="true" multiValued="true"/>二、multivalued字段的特性存储多个值:multivalued字段可以存储多个值,这些值可以是相同类型或不同类型的数据。
这使得multivalued字段非常适合存储如标签、关键词、分类等信息。
高效检索:Solr对multivalued字段进行了优化,使其能够进行高效的检索操作。
用户可以使用Solr的查询语法,对multivalued字段进行精确的匹配、范围查询、模糊查询等操作。
动态更新:multivalued字段支持动态更新。
这意味着在文档被索引后,用户仍然可以向multivalued字段添加或删除值。
这为企业级搜索应用提供了极大的便利,可以根据业务需求灵活地调整索引结构。
扩展性强:Solr的multivalued字段具有很好的扩展性,可以与其他数据类型和功能进行集成。
solrcloud简介
Solr进化史 倒排表 了解solrCloud 搭建solrCloud集群 Zookeeper Leader 选举 Collections+cores API
Collections
创建collection: /admin/collections?action=CREATE&name=mycollection&numShards=4&replicationFactor=2&maxSha rdsPerNode=2&collection.configName=mycollection 删除collection:/admin/collections?action=DELETE&name=mycollection 修改collection: /admin/collections?action=MODIFYCOLLECTION&collection=mycollection&maxShardsPerNode=24 重新加载collection:/admin/collections?action=RELOAD&name=mycollection 创建shard(only to 'implicit' collections): /admin/collections?action=CREATESHARD&collection=mycollection&shard=shard_n&createNodeSet =172.25.8.190:9200_solr 拆分shard: /admin/collections?action=SPLITSHARD&collection=mycollection&shard=shard1 删除shard: /admin/collections?action=DELETESHARD&collection=mycollection&shard=shard1 创建别名: /admin/collections?action=CREATEALIAS&name=testalias&collections=mycollection,mycollectio n_1 删除别名:/admin/collections?action=DELETEALIAS&name=testalias 删除副本: /admin/collections?action=DELETEREPLICA&collection=mycollection_1&shard=shard5&replica=my collection_1_shard5_replica2
Solr的应用场景分析
Solr的应用场景分析Solr是一个基于Java的搜索引擎,被广泛应用于Web搜索、文档管理、电商等各种应用场景。
本文将从Solr的特性入手,探讨其主要应用场景及其优势。
一、高效搜索引擎Solr的核心特性是高效搜索引擎,它能够处理大量的数据,并且具有快速的搜索速度。
因此,Solr适用于大型网站、Web应用程序以及企业级应用程序等各种情况下的搜索引擎。
1、电子商务在电子商务行业,Solr可以帮助电商网站提供快速、精准的搜索体验,减少用户的等待时间,促进转化率。
Solr具有高效的搜索速度以及高质量的搜索结果,可以根据用户的搜索需求,实现智能联想、拼写检查等搜索辅助功能,提高用户体验。
另外,Solr还支持基于地理位置的搜索,比如可以按照用户所在地域,展示用户附近的产品信息,大大提升用户的便利性。
2、企业应用程序在企业应用程序中,Solr也经常被用作搜索引擎,能够搜索企业内存储的各种数据,例如产品信息、客户、工程文件等。
Solr提供了高度灵活的搜索体验,用户可以通过各种搜索参数,实现快速、准确地检索所需的数据。
二、文档管理系统Solr不仅仅是一个搜索引擎,同时也是一个强大的文档管理系统,支持各种数据格式的索引和搜索。
因此,Solr可以被广泛应用于文档管理系统,帮助用户快速准确的检索所需文件。
1、数字资料库Solr可以作为数字资料库的一部分,能够实现全文检索和查询,而不仅仅是简单的关键字检索。
数字资料库包括了各种类型的文件,例如PDF文件、Microsoft Office文件、HTML文件等,Solr可以基于这些文件的内容建立索引,并实现快速准确的搜索功能。
2、知识管理系统Solr可以作为一个知识管理系统的组件,帮助企业组织内部的知识库。
当员工需要查询某种信息时,Solr可以搜索企业内多种数据源的内容,并返回相关的结果。
此外,Solr还具有自动标记、选取等功能,能够帮助企业快速实现知识共享,提高工作效率。
solr 查询语句
solr 查询语句Solr是一个开源搜索服务器,它能够快速处理大量数据,并支持高分布式搜索环境中的多种搜索策略。
Solr查询语句是Solr查询数据时所使用的语句。
Solr查询语句的语法类似于SQL语句,但存在一些差异。
Solr查询语句由操作符、字段和值组成。
其中,操作符包括and、or、not等逻辑操作符,字段包括查询的字段名,值包括要查询的值。
在Solr中,查询语句也支持通配符、模糊查询和正则表达式等高级查询。
通配符可处理模糊查询,例如用*代表任意字符串,用?代表一个字符。
模糊查询能够识别类似单词拼写错误等情况。
正则表达式则能够处理更复杂的搜索需求。
以下是Solr查询语句的一些示例:1. 查询内容包含"apple"且分数大于等于4的所有文档:q=apple&fq=score:[4 TO *]2. 查询内容包含"apple"或者"orange"的所有文档:q=apple OR orange3. 查询标题为"Solr"或"Lucene"、内容包含"search"的所有文档:q=title:(Solr OR Lucene) AND content:search4. 查询内容包含"apple"或"orange"的所有文档,但是要排除同时包含"pie"的文档:q=(apple OR orange) AND NOT pie5. 查询内容以"apple"开头的所有文档:q=content:apple*6. 查询内容中包含"apple"或者"orange"的所有文档,并且支持字符串拼写错误:q=apple~ OR orange~以上仅为Solr查询语句的常见用法示例,实际查询需根据具体业务场景和数据特点选择合适的查询语句。
SOLR中文教程
SOLR中文帮助文档2010-10目录1概述 (4)1.1企业搜索引擎方案选型 (4)1.2Solr的特性 (4)1.2.1Solr使用Lucene并且进行了扩展 (4)1.2.2Schema(模式) (5)1.2.3查询 (5)1.2.4核心 (5)1.2.5缓存 (5)1.2.6复制 (6)1.2.7管理接口 (6)1.3Solr服务原理 (6)1.3.1索引 (6)1.3.2搜索 (7)1.4源码结构 (8)1.4.1目录结构说明 (8)1.4.2Solr home说明 (9)1.4.3solr的各包的说明 (10)1.5版本说明 (11)1.5.1 1.3版本 (11)1.5.2 1.4版本 (12)1.6分布式和复制Solr 架构 (12)2Solr的安装与配置 (13)2.1在Tomcat下Solr安装 (13)2.1.1安装准备 (13)2.1.2安装过程 (13)2.1.3验证安装 (14)2.2中文分词配置 (15)2.2.1mmseg4j (15)2.2.2paoding (19)2.3多核(MultiCore)配置 (22)2.3.1MultiCore的配置方法 (22)2.3.2为何使用多core ? (23)2.4配置文件说明 (23)2.4.1schema.xml (24)2.4.2solrconfig.xml (25)3Solr的应用 (29)3.1SOLR应用概述 (29)3.1.1Solr的应用模式 (29)3.1.2SOLR的使用过程说明 (30)3.2一个简单的例子 (30)3.2.1Solr Schema 设计 (30)3.2.2构建索引 (30)3.2.3搜索测试 (31)3.3搜索引擎的规划设计 (32)3.3.1定义业务模型 (32)3.3.2定制索引服务 (34)3.3.3定制搜索服务 (34)3.4搜索引擎配置 (34)3.4.1Solr Schema 设计(如何定制索引的结构?) (34)3.5如何进行索引操作? (36)3.5.1基本索引操作 (36)3.5.2批量索引操作 (37)3.6如何进行搜索 (39)3.6.1搜索语法 (39)3.6.2排序 (42)3.6.3字段增加权重 (42)3.6.4Solr分词器、过滤器、分析器 (42)3.6.5Solr高亮使用 (46)4SolrJ的用法 (46)4.1搜索接口的调用实例 (46)4.2Solrj的使用说明 (47)4.2.1Adding Data to Solr (47)4.2.2Directly adding POJOs to Solr (49)4.2.3Reading Data from Solr (51)4.3创建查询 (51)4.4使用SolrJ 创建索引 (52)4.5Solrj包的结构说明 (53)4.5.1CommonsHttpSolrServer (53)4.5.2Setting XMLResponseParser (53)4.5.3Changing other Connection Settings (53)4.5.4EmbeddedSolrServer (54)5Solr的实际应用测试报告 (54)5.1线下压力测试报告 (54)5.2线上环境运行报告 (54)6solr性能调优 (55)6.1Schema Design Considerations (55)6.1.1indexed fields (55)6.1.2stored fields (55)6.2Configuration Considerations (55)6.2.1mergeFactor (55)6.2.2mergeFactor Tradeoffs (56)6.3Cache autoWarm Count Considerations (56)6.4Cache hit rate(缓存命中率) (56)6.5Explicit Warming of Sort Fields (56)6.6Optimization Considerations (56)6.7Updates and Commit Frequency Tradeoffs (56)6.8Query Response Compression (57)6.9Embedded vs HTTP Post (57)6.10RAM Usage Considerations(内存方面的考虑) (57)6.10.1OutOfMemoryErrors (57)6.10.2Memory allocated to the Java VM (57)7FAQ (58)7.1出现乱码或者查不到结果的排查方法: (58)概述企业搜索引擎方案选型由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择:基于Lucene自己进行封装实现站内搜索。
Solr5.5搜索引擎之分词原理说明
Solr5.5搜索引擎之分词原理说明1.中文分词1.1 概念众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文时以字为单位,句子中所有的字连起来才能描述一个意思。
例如,英文句子I am a student,用中文则为:“我是一个学生”。
计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”,“生”两个字合起来才表示一个词。
把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。
“我是一个学生”的分词结果是:“我是一个学生”。
摘自/archives/333.html1.2 应用目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,很多西文的处理方法对中文不能直接采用,就是因为中文必须有分词这道工序。
中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。
其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。
因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也要解决中文分词问题。
分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。
因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。
2.搜索引擎和中文分词2.1 搜索引擎的工作原理摘自:/renenglish/article/details/5847100搜索引擎为什么能快速检索到自己查询的关键字呢?实际上得益于它的数据存储机制“倒排索引”,这里用一个例子来大体说明什么是倒排索引。
假设我有10篇文章,它们可能论述了相同或不同的主题。
如果我想看看哪篇文章中含有“中文分词”这个词语,我可以循环遍历每篇文章,看看他的内容中有没有含有“中文分词”这个词语,然后把含有目标词语的文章返回。
solr使用方法
solr使用方法Solr是一种开源的搜索平台,基于Apache Lucene构建而成。
它提供了强大的全文检索功能和高性能的分布式搜索能力,广泛应用于各种大型网站和企业应用中。
本文将介绍Solr的使用方法,包括安装配置、数据导入、搜索查询等方面。
一、安装配置1. 下载Solr:访问官方网站,下载最新版本的Solr压缩包。
2. 解压缩:将下载的压缩包解压到指定目录。
3. 启动Solr:进入解压后的目录,执行启动命令,等待Solr启动成功。
4. 访问Solr管理界面:打开浏览器,输入Solr的地址和端口号,进入Solr的管理界面。
二、数据导入1. 创建Core:在Solr管理界面中,创建一个Core,用于存储和管理数据。
2. 定义Schema:在Core中定义Schema,指定数据的字段类型、索引配置等。
3. 导入数据:将数据准备好,使用Solr提供的数据导入工具,将数据导入到Core中。
三、搜索查询1. 构建查询请求:使用Solr提供的查询语法,构建查询请求。
2. 发送查询请求:将查询请求发送给Solr服务器,等待返回结果。
3. 解析查询结果:解析返回的结果,获取需要的信息。
四、高级功能1. 分页查询:通过设置start和rows参数,实现分页查询功能。
2. 排序:通过设置sort参数,实现结果的排序。
3. 过滤查询:通过设置fq参数,实现对结果的过滤。
4. 高亮显示:通过设置hl参数,实现搜索关键词的高亮显示。
5. 聚合统计:通过设置facet参数,实现对搜索结果的聚合统计。
五、性能优化1. 索引优化:通过优化索引结构、字段配置等,提升索引的性能。
2. 查询优化:通过合理使用缓存、调整查询参数等,提升查询的性能。
3. 集群部署:将Solr部署到多台服务器上,实现分布式搜索,提升系统的吞吐量和可用性。
六、常见问题解决1. 乱码问题:通过设置字符集、使用适当的分词器等,解决乱码问题。
2. 性能问题:通过调整配置参数、优化查询语句等,解决性能问题。
Solr入门实战(4)--Java操作Solr
Solr⼊门实战(4)--Java操作Solr本⽂主要介绍使⽤ Java 来操作 Solr,⽂中所使⽤到的软件版本:Java 1.8.0_191、Solr 8.9.0。
1、定义 Schema 信息假设⼀个描述诗⼈信息的⽂档包含如下字段:字段描述id唯⼀主键age年龄name姓名poems诗歌about简介success成就定义的 schema 信息如下:<field name="about" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="age" type="pint" uninvertible="true" indexed="true" stored="true"/><field name="content" type="text_ik" uninvertible="true" indexed="true" stored="true" multiValued="true"/><field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/><field name="name" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="poems" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="success" type="text_ik" uninvertible="true" indexed="true" stored="true"/>2、Java 操作 Solr2.1、引⼊依赖<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>8.9.0</version></dependency><dependency><groupId>org.apache.solr</groupId><artifactId>solr-core</artifactId><version>8.9.0</version></dependency>2.2、编写 demo2.2.1、增加/更新⽂档@Testpublic void update() throws IOException, SolrServerException {SolrInputDocument document = new SolrInputDocument();document.addField("id", "123456");document.addField("age", 30);document.addField("name", "李⽩2");document.addField("poems", "望庐⼭瀑布");document.addField("about", "字太⽩");document.addField("success", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度");SolrInputDocument document2 = new SolrInputDocument();document2.addField("id", "123457");document2.addField("age", 31);document2.addField("name", "杜甫");document2.addField("poems", "望岳");document2.addField("about", "字⼦美");document2.addField("success", "唐代伟⼤的现实主义⽂学作家,唐诗思想艺术的集⼤成者");solrClient.add(coreName, document);solrClient.add(coreName, document2);mit(coreName, true,true);}还可以通过实体类来增加/更新⽂档:@Testpublic void update2() throws IOException, SolrServerException {PoetInfo info = new PoetInfo("123456", 40, "李⽩", "望庐⼭瀑布", "字太⽩", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); solrClient.addBean(coreName, info);mit(coreName, true,true);}2.2.2、查询⽂档/*** 通过 MapSolrParams 查询*/@Testpublic void query() throws IOException, SolrServerException {Map<String, String> map = new HashMap<>();//查询条件map.put("q", "*:*");//要显⽰的内容map.put("fl", "id,age,name,poems");//排序⽅式map.put("sort", "id asc");MapSolrParams solrParams = new MapSolrParams(map);QueryResponse queryResponse = solrClient.query(coreName, solrParams); SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 通过 solrQuery 查询*/@Testpublic void query2() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery); SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 查询返回实例类对象*/@Testpublic void query3() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addField("about");solrQuery.addField("success");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery); List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);("查询到{}个⽂档!", list.size());for (PoetInfo info : list) {(info.toString());}}2.2.3、删除⽂档/*** 根据id删除⽂档*/@Testpublic void delete() throws IOException, SolrServerException {solrClient.deleteById(coreName, "123456");mit(coreName, true,true);}/*** 根据查询删除⽂档*/@Testpublic void delete2() throws IOException, SolrServerException {solrClient.deleteByQuery(coreName, "name:杜甫");mit(coreName, true,true);}2.2.4、完整代码package com.abc.demo.general.solr;import org.apache.solr.client.solrj.beans.Field;public class PoetInfo {@Fieldprivate String id;@Fieldprivate Integer age;@Fieldprivate String name;@Fieldprivate String poems;@Fieldprivate String about;@Fieldprivate String success;public PoetInfo() {}public PoetInfo(String id, Integer age, String name, String poems, String about, String success) { this.id = id;this.age = age; = name;this.poems = poems;this.about = about;this.success = success;}@Overridepublic String toString() {return "Info{" +"id='" + id + '\'' +", age=" + age +", name='" + name + '\'' +", poems='" + poems + '\'' +", about='" + about + '\'' +", success='" + success + '\'' +'}';}public String getId() {return id;}public void setId(String id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) { = name;}public String getAbout() {return about;}public void setAbout(String about) {this.about = about;}public String getSuccess() {return success;}public void setSuccess(String success) {this.success = success;}}PoetInfopackage com.abc.demo.general.solr;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import mon.SolrDocument;import mon.SolrDocumentList;import mon.SolrInputDocument;import mon.params.MapSolrParams;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;public class SolrCase {private static Logger logger = LoggerFactory.getLogger(SolrCase.class);private HttpSolrClient solrClient;private String coreName = "new_core";@Beforepublic void before() {solrClient = new HttpSolrClient.Builder("http://10.40.100.69:8983/solr").withConnectionTimeout(10000).withSocketTimeout(60000).build();}@Afterpublic void after() throws IOException {solrClient.close();}@Testpublic void update() throws IOException, SolrServerException {SolrInputDocument document = new SolrInputDocument();document.addField("id", "123456");document.addField("age", 30);document.addField("name", "李⽩2");document.addField("poems", "望庐⼭瀑布");document.addField("about", "字太⽩");document.addField("success", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); SolrInputDocument document2 = new SolrInputDocument();document2.addField("id", "123457");document2.addField("age", 31);document2.addField("name", "杜甫");document2.addField("poems", "望岳");document2.addField("about", "字⼦美");document2.addField("success", "唐代伟⼤的现实主义⽂学作家,唐诗思想艺术的集⼤成者");solrClient.add(coreName, document);solrClient.add(coreName, document2);mit(coreName, true,true);}@Testpublic void update2() throws IOException, SolrServerException {PoetInfo info = new PoetInfo("123456", 40, "李⽩", "望庐⼭瀑布", "字太⽩", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); solrClient.addBean(coreName, info);mit(coreName, true,true);}/*** 通过 MapSolrParams 查询*/@Testpublic void query() throws IOException, SolrServerException {Map<String, String> map = new HashMap<>();//查询条件map.put("q", "*:*");//要显⽰的内容map.put("fl", "id,age,name,poems");//排序⽅式map.put("sort", "id asc");MapSolrParams solrParams = new MapSolrParams(map);QueryResponse queryResponse = solrClient.query(coreName, solrParams);SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 通过 solrQuery 查询*/@Testpublic void query2() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery);SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 查询返回实例类对象*/@Testpublic void query3() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addField("about");solrQuery.addField("success");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery);List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);("查询到{}个⽂档!", list.size());for (PoetInfo info : list) {(info.toString());}}/*** 根据id删除⽂档*/@Testpublic void delete() throws IOException, SolrServerException {solrClient.deleteById(coreName, "123456");mit(coreName, true,true);}/*** 根据查询删除⽂档*/@Testpublic void delete2() throws IOException, SolrServerException {solrClient.deleteByQuery(coreName, "name:杜甫");mit(coreName, true,true);}}SolrCase3、Java 操作 SolrCloudJava 操作 SolrCloud 与 Java 操作 Solr 很类似,主要区别有:1、连接使⽤的类不同,连接 Solr 使⽤的是 HttpSolrClient,连接 SolrColud 使⽤的是 CloudHttp2SolrClient。
SOLR查询,SOLR语法,SOLR更新
一.基本查询q–查询字符串,必须的。
fl–指定返回那些字段内容,用逗号或空格分隔多个。
start–返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows–指定返回结果最多有多少条记录,配合start来实现分页。
sort–排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]…。
示例:(inStock desc,price asc)表示先“inStock”降序,再“price”升序,默认是相关性降序。
wt–(writer type)指定输出格式,可以有xml,json,php,phps,后面solr1.3增加的,要用通知我们,因为默认没有打开。
fq–(filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001TO20091031],找关键字mm,并且date_time是20081001到20091031之间的。
q.op–覆盖schema.xml的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定df–默认的查询字段,一般默认指定qt–(query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
-排除在要排除的词前加上“-”(不包含”号)号其它indent–返回的结果是否缩进,默认关闭,用indent=true|on开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
version–查询语法的版本,建议不使用它,由服务器指定默认值。
[Solr的检索运算符]“:”指定字段查指定值,如返回所有值*:*²“?”²表示单个任意字符的通配“*”表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)²“~”²表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
solr 查询语法
solr 查询语法Solr查询语法Solr是一个开源的搜索平台,它提供了强大的搜索和相关性引擎,可以用于快速构建搜索引擎。
Solr的查询语法非常灵活,可以满足不同的搜索需求,本文将详细介绍Solr查询语法。
Solr查询语法包括两种类型的查询:参数查询和字符串查询。
参数查询参数查询是通过URL参数传递查询请求的方式。
常用的查询参数包括:q:查询字符串,用于指定要搜索的文本。
fq:过滤查询,用于限制搜索范围。
fl:指定返回的字段列表。
sort:指定结果排序方式。
start:指定结果的起始位置。
rows:指定返回的结果数量。
wt:指定返回结果的格式,如json、xml等。
字符串查询字符串查询是通过查询语法构建查询请求的方式。
Solr支持多种查询语法,包括:简单查询语法简单查询语法是最常用的查询语法,它支持使用“:”来指定查询字段和查询值。
例如,要搜索title字段包含“Solr”的文档,可以使用如下查询:title:Solr复杂查询语法复杂查询语法支持使用逻辑运算符(AND、OR和NOT)来组合多个查询条件。
例如,要搜索title字段包含“Solr”且content字段包含“Lucene”的文档,可以使用如下查询:title:Solr AND content:Lucene范围查询语法范围查询语法用于搜索特定范围内的值。
例如,要搜索price字段在10到100之间的文档,可以使用如下查询:price:[10 TO 100]通配符查询语法通配符查询语法用于搜索与指定模式匹配的文档。
例如,要搜索title字段以“Solr”开头的文档,可以使用如下查询:title:Solr*正则表达式查询语法正则表达式查询语法用于搜索与指定正则表达式匹配的文档。
例如,要搜索title字段包含“Solr”或“Lucene”的文档,可以使用如下查询:title:/Solr|Lucene/模糊查询语法模糊查询语法用于搜索与指定词语相似的文档。
solr 分词规则
solr 分词规则Solr 分词规则是指在 Solr 搜索引擎中用于将文本分割成单独的词语的规则。
分词是Solr 在执行搜索操作时的重要步骤,它将输入的文本进行分词后,建立索引,并根据用户的搜索查询进行匹配。
Solr 默认采用区分大小写的分词规则,即将词语按照空格、标点符号等进行分隔。
但对于许多搜索应用来说,这种简单的分词方式可能不够准确。
因此,Solr 提供了多种自定义分词规则以满足不同需求。
1. 字符过滤器:Solr 中的字符过滤器用于对文本进行预处理,例如去除 HTML 标签、转换成小写或忽略特定字符等。
这些过滤器可以通过 Solr 配置文件进行配置。
2. 分词器:分词器是 Solr 中最核心的组件之一,它将文本分割成独立的词语。
Solr 提供了多种分词器,如标准分词器、较少使用的简单分词器、正则表达式分词器等。
你可以根据需求选择适合的分词器。
3. 过滤器:过滤器用于进一步处理分词结果,如去除停用词、同义词替换、词干化等。
Solr 提供了多种过滤器,如停用词过滤器、同义词过滤器、词干过滤器等。
你可以根据需要配置相应的过滤器。
4. Token:在 Solr 中,分词后得到的独立词语称为 Token。
在搜索中,Solr 将根据查询语句与 Token 进行匹配,并返回相应的搜索结果。
5. 分词规则优化:除了默认提供的分词规则和组件外,Solr 还允许用户根据特定需求进行自定义分词。
这可以通过编写自定义分词器、字符过滤器和其他自定义组件来实现。
总之,Solr 分词规则是用于将文本分割成单独的词语的规则。
通过合理配置字符过滤器、分词器和过滤器等组件,我们可以更好地适应具体搜索应用的需求,并提高搜索的准确性和效率。
solr全文检索_初级教程
Apache Solr 初学者——初级教程(介绍、安装部署、Java接口、中文分词)Apache Solr 介绍Solr 是什么?Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。
服务器通信使用标准的HTTP 和XML,所以如果使用Solr 了解Java 技术会有用却不是必须的要求。
Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word ,PDF 等)的处理。
而且Solr 具有高度的可扩展,支持分布搜索和索引的复制。
Lucene 是什么?Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。
Lucene 目前是 Apache Jakarta 家族中的一个开源项目。
也是目前最为流行的基于 Java 开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于 Lucene ,比如 Eclipse 帮助系统的搜索功能。
Lucene 能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。
Solr VS LuceneSolr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。
需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene 。
安装搭建Solr安装Java 虚拟机Solr 必须运行在Java1.5 或更高版本的Java 虚拟机中,运行标准Solr 服务只需要安装JRE 即可,但如果需要扩展功能或编译源码则需要下载JDK 来完成。
可以通过下面的地址下载所需JDK 或JRE :∙OpenJDK (/j2se/downloads.html)∙Sun (/j2se/downloads.html)∙IBM (/developerworks/java/jdk/)∙Oracle (/technology/products/jrockit/index.html)安装步骤请参考相应的帮助文档。
solr之~模糊查询
solr之~模糊查询有的时候,我们一开始不可能准确地知道搜索的关键字在Solr 中查询出的结果是什么,因此,Solr 还提供了几种类型的模糊查询。
模糊匹配会在索引中对关键字进行非精确匹配。
例如,有的人可能想要搜索某个前缀开始的单词(称为通配符查询),或者想要查询和关键字有一两个字母不相同的单词(称为模糊查询或编辑距离查询),或者你想要查询两个关键字,并且这两个关键字之间的距离不会大于某个最大值(称为临近查询)。
总的说来,模糊匹配是查询中的一个强大的工具。
通配符查询在Solr 中最普遍使用的模糊查询就是使用通配符。
假设你想要查询以 offic 开始的文档。
下面列举出这个查询的几个版本:•查询语句: office OR officer OR official OR officiate OR … 这个列表中的单词是所有你以 offic 开头的单词。
因为你需要找到的所有匹配都在Solr 索引中。
因此,你可以使用星号(*)作为通配符来执行相同的功能:•查询语句: offi* 匹配 office, officer, official 等等。
除了放在关键字的最后,通配符也可以放到关键字中间,例如,如果你想要同时匹配 officer 和 offer:•查询语句: off*r 匹配 offer,officer,officiator 等。
星号通配符(*)表示匹配 0 个或多个字符。
如果你只需要匹配一个字符,那么可以使用问号(?)通配符:•查询语句: off?r 匹配 offer 但是不匹配 officer。
以通配符为头进行查询在Solr 中使用通配符相当强大。
但是,使用通配符进行查询也会带来很大的开销。
一旦使用统配符的查询,那么在关键字中第一个通配符之前的部分需要在反向索引中全部查询出来。
那后,每个查询出来的结果在逐一进行检查,看是否符合查询条件。
正是因为这样,所以在统配符之前的字符越多,那么查询将会越快。
例如,使用engineer* 进行查询将不会带来很高的开销(因为这个查询在反向索引中不会找到太多的匹配),但是 e* 进行查询的开销就相当大,它将会匹配所有 e 开头的单词。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
solr中文:使用 Apache Solr 实现更加灵巧的搜索 第 2 部分: 用于企业的 Solr疯狂代码 / ĵ:http://DeveloperUtil/Article54041.html 本文举例源代码或素材下载 在本系列 第 1 部分我为您介绍了 Apache Solr种基于 HTTP 开源搜索服务器它可以很容易地和多种Web 应用集成我展示了 Solr 最基本功能包括索引、搜索和浏览介绍了 Solr 模式并解释了它在配置 Solr 功能方面作用在本部分中我将通过列举 Solr 作为大型生产环境中理想解决方案时所具备特性来完成对 Solr 介绍涵盖主题包括管理、缓存Cache、复制和可扩展性 请参阅 第 1 部分 来获得安装和设置 Solr 指导 配置和管理 本部分介绍了可用于监视和控制 Solr 功能性诸多选项首先来看看 Solr Administration Start Page该页可在 http://localhost:8080/solr/admin/ 找到旦找到了起始页在继续的前请务必花些时间熟悉下上面各种菜单选项在起始页中根据这些选项所提供信息区别对它们进行了分组: Solr 给出了有关这种活动模式(请参见 第 1 部分)、配置以及当前部署统计数据详细信息 App server 给出了容器当前状态包括 threading 信息以及所有 Java 系统属性列表 Make a Query 提供了调试查询所需快捷界面以及到功能更加全面查询界面链接 Assistance 提供了到外部资源有用链接以便理解和解决使用 Solv 可能遇到些问题 如下章节详细介绍了这些菜单选项并重点突出了其中管理特性 要使用 Solr 配置选项可以单击页上 CONFIG 链接这会显示当前 solrconfig.xml 文件您可以在 举例应用dw-solr/solr/conf 目录找到该文件现在让我们先来看看和索引和查询处理有关些常见配置选项而和 缓存Cache、复制 和 扩展 Solr 有关配置选项则留到后面章节再介绍 索引配置 Index 标记段定义了控制 Solr 索引处理低水平 Lucene 原因Lucene 基准发布(位于 Lucene 源代码contrib/benchmark 的下)包含了很多可用来对这些原因更改效果进行基准测试工具此外请参阅 参考资料 节中“Solr 性能原因” 来了解和各种更改相关性能权衡表 1 概括了可控制 Solr 索引处理各种原因:表 1. 对性能原因进行索引原因 描述useCompoundFile 通过将很多 Lucene 内部文件整合到单个文件来减少使用中文件数量这可有助于减少 Solr 使用文件句柄数目代价是降低了性能除非是应用用完了文件句柄否则 false 默认值应该就已经足够mergeFactor 决定低水平 Lucene 段被合并频率较小值(最小为 2)使用内存较少但导致索引时间也更慢较大值可使索引时间变快但会牺牲较多内存maxBufferedDocs 在合并内存中文档和创建新段的前定义所需索引最小文档数段 是用来存储索引信息Lucene 文件较大值可使索引时间变快但会牺牲较多内存maxMergeDocs 控制可由 Solr 合并 Document 最大数较小值 (< 10,000) 最适合于具有大量更新应用maxFieldLength 对于给定 Document控制可添加到 Field 最大条目数进而截断该文档如果文档可能会很大就需要增加这个数值然而若将这个值设置得过高会导致内存不足unlockOnStartup unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引锁定机制在某些情况下索引可能会由于不正确关机或其他而直处于锁定这就妨碍了添加和更新将其设置为 true 可以禁用启动锁定进而允许进行添加和更新 查询处理配置 在 <query> 部分有些和 缓存Cache 无关特性这点您需要知道首先<maxBooleanClauses> 标记定义了可组合在起形成个查询子句数量上限对于大多数应用而言默认 1024 就应该已经足够;然而如果应用大量使用了通配符或范围查询增加这个限值将能避免当值超出时抛出 TooManyClausesException 通配符和范围查询通配符和范围查询是可自动扩展以包括所有可能匹配查询条件条目 Lucene 查询通配符查询允许使用 * 和 ? 通配符运算符而范围查询则要求匹配文档必须要在指定范围的内例如若查找 b*可能导致潜在数千个区别项都组合进这个查询进而会导致 TooManyClausesException 接下来若应用预期只会检索 Document 上少数几个 Field那么可以将 <enableLazyFieldLoading> 属性设置为 true懒散加载个常见场景大都发生在应用返回和显示系列搜索结果时候用户常常会单击其中个来查看存储在此索引中原始文档显示常常只需要显示很短段信息若考虑到检索大型 Document 代价除非必需否则就应该避免加载整个文档 最后<query> 部分负责定义和在 Solr 中发生事件相关几个选项首先作为种介绍方式Solr(实际上是Lucene)使用称为 Searcher Java 类来处理 Query 例子Searcher 将索引内容相关数据加载到内存中根据索引、CPU 以及可用内存大小这个过程可能需要较长段时间要改进这设计和显著提高性能Solr 引入了种 “温暖”策略即把这些新 Searcher 联机以便为现场用户提供查询服务的前先对它们进行 “热身”<query> 部分中<listener> 选项定义 Searcher 和 firstSearcher 事件您可以使用这些事件来指定例子化新搜索或第个搜索时应该执行哪些查询如果应用期望请求某些特定查询那么在创建新搜索或第个搜索时就应该反注释这些部分并执行适当查询 solrconfig.xml 文件剩余部分除 <admin> 的外涵盖了和 缓存Cache、复制 和 扩展或定制 Solr 有关项目admin 部分让您可以定制管理界面有关配置 admin 节更多信息请参看 Solr Wiki 和 solrconfig.xml 文件中注释 监视、记录和统计数据 在 http://localhost:8080/solr/admin 管理页有几个菜单条目可以让 Solr 管理员监视 Solr 过程表 2 给出了这些条目:表 2. 用于监视、记录和统计数据 Solr 管理选项菜单名 Admin URL 描述Statistics http://localhost:8080/solr/admin/stats.jsp Statistics 管理页提供了和 Solr 性能相关很多有用统计数据这些数据包括: 有关何时加载索引以及索引中有多少文档信息 有关用来服务查询 SolrRequestHandler 有用信息 涵盖索引过程数据包括添加、删除、提交等数量 缓存Cache实现和 hit/miss/eviction 信息Info http://localhost:8080/solr/admin/registry.jsp 有关正在运行 Solr 版本以及在当前实现中进行查询、更新和缓存Cache所使用类详细信息此外还包括文件存于 Solr subversion 存储库何处信息以及对该文件功能个简要描述Distribution http://localhost:8080/solr/admin/distributiondump.jsp 显示和索引发布和复制有关信息更多信息请参见 “发布和复制” 节Ping http://localhost: 8080/solr/admin/ping 向服务器发出 ping 请求包括在 solrconfig.xml 文件admin 部分定义请求Logging http:// localhost:8080/solr/admin/logging.jsp 让您可以动态更改当前应用日志记录等级更改日志记录等级对于调试在执行过程中可能出现问题非常有用Java properties http: //localhost:8080/solr/admin/get-properties.jsp 显示当前系统正在使用所有 Java 系统属性Solr 支持通过命令行系统属性替换有关实现此特性更多信息请参见 solrconfig.xml 文件Thread dump http://localhost:8080/solr/admin/threaddump.jsp thread dump 选项显示了在 JVM 中运行所有线程堆栈跟踪信息 调试此分析过程 经常地当创建搜索实现时您都会输入个应该匹配特定文档搜索但它不会出现在结果中在大多数情况下故障都是由如下两个原因的引起: 查询分析和文档分析不匹配(虽然不推荐但对文档分析可能会和对查询分析区别) Analyzer 正在修改区别于预期个或多个条目 可以使用位于 http://localhost:8080/solr/admin/analysis.jsp Solr 分析管理功能来深入调查这两个问题Analysis 页可接受用于查询和文档文本片段以及能确定文本该如何分析并返回正被修改文本逐步结果 Field 名称图 1 显示了分析句子 “The Carolina Hurricanes are the reigning Stanley Cup champions, at least for a few more weeks” 以及相关查询 “Stanley Cup champions” 部分结果正如为举例应用 schema.xml 中指定 content Field 分析那样:图 1. 对分析进行调试" _disibledevent=val1</str> </arr></listener> 清单 1 显示了在收到 commit 事件后在主服务器上创建快照所需配置同样配置也同样适用处理 optimize 事件在这个举例配置中在 commit 完成后Solr 位于 solr/bin 目录 snapshooter 脚本传入指定参数和环境变量wait 实参告知 Solr 在继续的前先等待线程返回有关执行 snapshooter 和其他配置脚本详细信息请参见 Solr 网站WebSite上 “Solr Collection and Distribution Scripts” 文档(请参见 参考资料) 在从服务器上使用 snappuller shell 脚本从主服务器上检索快照snappuller 从主服务器上检索了所需文件后snaper shell 脚本就可用来安装此快照并告知 Solr 有个新快照可用根据快照创建频率最好是安排系统定期执行这些步骤在主服务器上rsync 守护在从服务器获得快照的前必须先行启动rsyn 守护可用 rsyncd-enable shell 脚本启用然后再用 rsyncd-start 命令实际启动在从服务器上snappuller-enable shell 脚本必须在 snappuller shell 脚本的前运行 排除发布故障 虽然我们已经竭尽全力地对索引更新发布进行了优化但还是有几个常见场景会为 Solr 带来问题: 优化大型索引可能会非常耗时而且应该在索引更新不是很频繁情况下才进行优化会导致多个 Lucene 索引文件合并成个单文件这就意味者从服务器必须要复制整个索引然而这种方式优化还是比在每个从服务器上进行优化要好很多这些服务器可能和主服务器区别步导致新副本再次被检索 如果从主服务器中获取新快照频率过高则从服务器性能可能会降低这种降低源于使用 snappuller 复制更改开销以及在安装新索引时缓存Cache预热有关频繁索引更新方面性能均衡详细信息请参见 参考资料 中 “Solr Performance Factors” 最终向从服务器添加、提交和获取更改频繁程度完全取决于您自己业务需求和硬件能力仔细测试区别场景将会帮助您定义何时需要创建快照以及何时需要从主服务器中获取这些快照有关设置和执行 Solr 发布和复制更多信息请参看 参考资料 中 “Solr Collection and Distribution” 文档 定制 Solr Solr 提供了几个插件点您可以在这里添加定制功能来扩展或修改 Solr 处理此外由于 Solr 是开源所以如果需要区别功能您尽可以更改源代码有两种方式可以向 Solr 添加插件: 打开 Solr WAR在 WEB-INF/lib 目录下添加新库重新打包这些文件然后将 WAR 文件部署到 servlet 容器 将 JAR 放入 Solr Home lib 目录然后启动 servlet 容器这种思路方法使用了定制 ClassLoader 且有可能不适用于某些 servlet 容器 接下来几个章节突出介绍了可能希望扩展 Solr 几个领域 请求处理 若现有功能不能满足业务需求Solr 允许应用实现其自身请求处理功能比如您可能想要支持您自己查询语言或想要将 Solr 和您用户配置文件相集成来提供个性化效果SolrRequestHandler 接口定义了实现定制请求处理所需思路方法实际上除了 第 1 部分 所使用那些默认 “标准” 请求处理的外Solr 还定义了其他几个请求处理: 默认 StandardRequestHandler 使用 Lucene Query Parser 语法处理查询添加了排序和层面浏览 DisMaxRequestHandler 被设计用来通过更为简单语法来跨多个 Field 进行搜索它也支持排序(使用和标准处理稍有区别语法)和层面浏览 IndexInfoRequestHandler 可以检索有关索引信息比如索引中文档数或 Field 数 请求处理是由请求中 qt 参数指定Solr servlet 使用参数值来查找给定请求处理并将输入用于请求处理处理请求处理声明和命名通过 solrconfig.xml 中 <requestHandler> 标记指定要添加其他内容只需实现定制SolrRequestHandler 线程安全例子即可将其添加到 上述 定义好 Solr并将其包括到 如前所述 类路径中的后就可以通过 HTTP GET 或 POST 思路方法开始向其发送请求了 响应处理 和请求处理类似也可以定制响应输出必须要支持老式搜索输出或必须要使用 2进制或加密输出格式应用可以通过实现 QueryResponseWriter 来输出所需格式然而在添加您自己 QueryResponseWriter 的前需要先深入研究下 Solr 所自带实现如表 4 所示:表 4. Solr 查询响应书写器查询响应书写器 描述XMLResponseWriter 这个最为常用响应格式以 XML 格式输出结果如 第 1 部分 博客应用所示XSLTResponseWriter XSLTResponseWriter 将 XMLResponseWriter 输出转换成指定 XSLT 格式请求中 tr参数指定了要使用 XSLT 转换名称指定转换必须存在于 Solr Home conf/xslt 目录有关 XSLT Response Writer 更多内容请参见 参考资料JSONResponseWriter 用 JavaScript Object Notation (JSON) 格式输出结果JSON 是种简单、人类可读数据转换格式而且非常易于机器解析RubyResponseWriter RubyResponseWriter 是对 JSON 格式扩展以便在 Ruby 中安全地使用结果若有兴趣将 Ruby 和 Solr 结合使用可以参考 参考资料 中给出到 acts_as_solr 和 Flare 链接PythonResponseWriter 对 JSON 输出格式扩展以便在 Python eval 思路方法中安全地使用 QueryResponseWriter 通过 <queryResponseWriter> 标记及其附属属性被添加至 Solr solrconfig.xml 文件响应类型通过 wt 参数在请求中指定默认值是 “标准”即在 solrconfig.xml 中设定为XMLResponseWriter最后要强调是QueryResponseWriter 例子必须提供用来创建响应 write 和getContentType 思路方法线程安全实现 Analyzer、Tokenizer、TokenFilter 和 FieldType 借助新 Analyzer、Tokenizer、TokenFilter 可以定制 Solr 索引输出以提供新分析功能自身需要Tokenizer 或 TokenFilter 应用必须实现其自身 TokenizerFactory 和 TokenFilterFactory这两者使用<tokenizer> 或 <filter> 标记(作为 <analyzer> 标记部分)在 schema.xml 中声明如果您从的前应用中已经获得了个 Analyzer那么就可以在 <analyzer> 标记 属性中声明它并进行使用您无需创建新 Analyzer除非是想要在其他 Lucene 应用中使用这些分析器 —— 在 schema.xml 中使用 <analyzer> 标记声明 Analyzer 真是容易呀! 如果应用有特定数据需求您可能需要添加个 FieldType 来处理数据比如可以添加个 FieldType 来处理来自旧应用 2进制字段在 Solr 中应该可以搜索到这个应用只需使用 <fieldtype> 声明将 FieldType 添加到schema.xml 并确保它在类路径中可用 性能考虑 虽然 Solr 可以开箱即用但还是有几个窍门技巧可有助于让它更易于使用和任何应用样仔细考虑您对数据访问具体业务需求任重而道远比如添加已索引 Field 越多对内存需求就越多、索引就越大、优化该索引所需时间也越长同样检索已存储 Field 会太多 I/O 处理而减慢服务器速度使用懒散字段加载或在他处存储大型内容可以为搜索请求释放 CPU 资源 在搜索层面上您应该考虑所支持查询类型很多应用都不需要 Lucene Query Parser 语法全部尤其是使用通配符和其他高级查询类型情况下就更是如此若能分析日志和确保常用查询被缓存Cache将会非常有帮助为般查询使用 Filter 对于减少服务器负载也非常有用和任何应用样全面地测试应用可确保 Solr 能够满足您性能需求有关 Lucene(和 Solr)性能更多信息请参阅 参考资料 中给出 ApacheCon Europe “Advanced Lucene” 幻灯片演示 Solr 前景光明 构建于 Lucene 速度和强大功能的上Solr 本身就证明了它完全可以成为企业级搜索解决方案它吸引了大量活跃社区使用者这些使用者已经将它用到了各种大型企业环境Solr 也获得了开发人员衷心支持他们还直在寻找提高它途径 在这个包含两部分文章您了解了 Solr包括它开箱即用索引和搜索功能以及用来配置其功能 XML 模式另外您还浏览了让 Solr 得以成为企业架构理想选择配置和管理特性最后您还获悉了采用 Solr 时性能考虑以及可用来扩展它架构有关 Solr 更多信息请参阅 参考资料 中文档2009-1-15 22:30:15疯狂代码 /。