solr视频教程 2.12、Solr的查询及Filter
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 功能使用
Solr 功能使用1. 准备阶段创建一个user schema,对其进行各种业务操作。
1.1. User元数据结构1.2. Solr schema设计●增加一个copyField text用于文本搜索1.3. 数据导入总共365051条记录,顺便感叹一下耗时,只花了5毫秒:2. 功能使用solr提供了多种语言的sdk,上面导入数据使用的是solrj,以下我就只用使用2.1. 基本查询http://172.16.5.2:8983/solr/user_shard2_replica1/select?q=*:*&wt=json&inden t=true&start=0&row=10&sort=followersCount+desc解释:●查询条件“*:*”,查询所有数据●格式化返回格式json:wt=json&indent=true●从0条开始,返回10条记录:start=0&row=10●按照用户粉丝量倒叙返回:sort=followersCount+desc,“+”号可使用空格代替更多的常用参数:●fq:对查询结果的二次筛选,且会把查询的结果缓存起来,下次同样的查询将直接命中缓存●fl:对返回的结果字段进行限制,例如我只想返回id更丰富的使用规范说明:https:///confluence/display/solr/Query+Syntax+and+Parsing 2.2. 权重查询DisMax以上面的schema为例,假设我需要查询所有“九江”的用户。
地区值是存放在location字段中的,也有可能用户只在location中只存放了“江西”,但是description中有可能存放了和九江相关的介绍,这样这个用户只能说有可能也是九江的,在查询是我希望确定是九江的用户排在前面。
这个时候就可以用到权重这个概念了。
上面的应用场景查询方式:http://172.16.5.2:8983/solr/user_shard2_replica1/select?q=text:%E4%B9%9D %E6%B1%9F&start=0&rows=10&wt=json&indent=true&defType=dismax&qf=l ocation^10+description^3权重查询常用参数:●defType=dismax,属于基本查询的参数,权重查询时必须是dismax●qf:权重设置,例如location^10就是location字段的权重设置,值得大小我理解是相对的,默认不设置的为1●mm:当查询条件(指的是参数个数,而非表达式个数)为多个时,设置返回最少匹配的次数另外还有很多参数,我还没有理解设计意图。
Filter函数使用教学课件
6、防错处理:第三参数的使用
• 查找不到数据会报错#CALC!,可以设置报错后的处理: • =FILTER(A2:C19,B2:B19="河北省","") • =FILTER(A2:C19,B2:B19="河北省","无此数据")
9
7、模糊筛选的掌握
• 模糊筛选的掌握,filter函数默认不支持*或?的模糊筛选 • =FILTER(A2:C19,B2:B19="*云南*") 会报错。 • 不过可以搭配其他函数解决模糊筛选的问题: • =FILTER(A2:C19,1-ISERR(FIND("云南",B2:B19)))
6
4、多条件满足其中之一的筛选
• 同时满足多个条件中一个即可被筛选,条件之间用括号和+相连 • =FILTER(A:D,(B:B="博士")+(C:C="辽宁省")+(D:D="A型")) • =FILTER(A:D,(D:D="A型")+(D:D="熊猫血型"))
7
5、数字条件的设置
• 当数据区域含有数字字段时,可以设置用常用数字的运算符: • =FILTER(A2:G17,C2:C17>60) • =FILTER(A2:G17,(C2:C17>60)*(D2:D17>60)) • =FILTER(A2:G17,(C2:C17>90)+(C2:C17<20)) • =FILTER(A2:G17,(C2:C17>90)+(G2:G17<60))
4
2、单区域单条件的设置
solr分词且精确查询
1、定义字段停止tomcat在solr\home(例如D:\data\solr)下,找到需要的collection(如D:\data\solr\collection1),在collection1\conf\schema.xml文件中添加solr字段:<field name="CONTENT" type="text" indexed="true" stored="true" /><field name="text" type="string" indexed="true" />2、定义字段类型“text”<fieldType name="text" class="solr.TextField"><analyzer type="index" ><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/><filter class="solr.WordDelimiterFilterFactory"generateWordParts="1"generateNumberParts="1"catenateWords="1"catenateNumbers="1"catenateAll="0"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.RemoveDuplicatesTokenFilterFactory"/></analyzer><analyzer type="query" ><tokenizer class="solr.StandardTokenizerFactory"/><!--<tokenizer class="solr.StandardTokenizerFactory"/>--><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.RemoveDuplicatesTokenFilterFactory"/></analyzer></fieldType>3、启动tomcat4、coding中使用solr查询语句" CONTENT:\"" + keyword + "\" "。
Solr搜索文档说明
Solr使用教程目录一、软件版本 (2)二、安装教程 (2)1、Solr安装教程 (2)2、solr环境搭建 (4)3、业务字段的实际配置 (7)4、dataimport 导入数据库数据 (8)5、solrj的使用 (10)6、电商平台的应用 (14)一、软件版本Solr版本号:solr-5.5.5jdk版本号:jdk1.8以上Tomcat版本号:Tomcat8.0以上二、安装教程1、Solr安装教程1.创建solrhome以及solrcore(mysolrhome、mycore 名字可以任意指定)1.1在指定的目录下新建文件夹solrhome如:D:\mysolrhome1.2将solr-5.5.4\server\solr\solr.xml拷贝至D:\mysolrhome1.3在solrhome下新建文件夹solrcore如D:\mysolrhome\mycore1.4将solr-5.5.4\server\solr\configsets\basic_configs\conf完整目录拷贝至D:\mysolrhome\mycore\下2.部署到Tomcat2.1将solr-5.5.4\server\solr-webapp\webapp 完整目录复制到Apache Tomcat 8.0.27\webapps下并重命名为solr2.2在Apache Tomcat 8.0.27\webapps\solr\WEB-INF下新建classes文件夹2.3将solr-5.5.4/server/resource/log4j.properties 拷贝至上一步创建的classes2.4把solr-5.5.4/server/lib/ext/目录下的所有jar文件复制到Apache Tomcat 8.0.27/webapp/solr/WEB-INF/lib/中3.配置solrcore3.1修改Apache Tomcat 8.0.27-solr\webapps\solr\WEB-INF\web.xml 新增<env-entry>标签,将你的solrhome配置进去。
solr query函数
Solr Query函数是Solr搜索平台中的一个重要功能,它允许用户在Solr索引中执行查询操作,并返回与查询条件匹配的结果集。
以下是关于Solr Query函数的简要介绍和800字左右的说明:Solr Query函数概述Solr Query函数是一种用于执行搜索查询的函数,它允许用户在Solr索引中快速查找和检索数据。
通过使用Query函数,用户可以在Solr搜索平台上执行各种类型的查询,如全文搜索、基于字段的搜索、范围搜索等。
这些查询可以根据用户的需求进行定制,以提供精确和高效的搜索结果。
主要功能和应用场景Solr Query函数的主要功能包括执行各种类型的搜索查询、处理查询结果、返回匹配项和相关文档。
这些查询可以针对单个字段或多个字段进行,支持各种搜索运算符,如AND、OR、NOT等。
通过使用Query函数,用户可以在各种应用场景中快速找到所需数据,如网站搜索、内容管理系统、电子商务平台等。
优化和性能考虑在执行Solr Query函数时,需要注意优化查询性能和稳定性。
可以通过使用合适的查询语句、调整索引配置、优化硬件配置等手段来提高查询性能。
同时,还应该注意查询结果的准确性和可靠性,确保返回的匹配项和相关文档符合预期。
与其他工具和技术的集成Solr Query函数可以与其他工具和技术进行集成,以实现更高效和灵活的搜索解决方案。
例如,可以与其他搜索引擎平台(如Elasticsearch)进行集成,以实现跨平台的数据搜索和协作。
还可以与其他数据处理和分析工具(如Python、R语言等)结合使用,对搜索结果进行进一步的处理和分析。
总结Solr Query函数是Solr搜索平台中一个重要的功能,它允许用户在Solr索引中执行各种类型的查询操作,并返回与查询条件匹配的结果集。
通过使用Query函数,用户可以在各种应用场景中快速找到所需数据,并优化查询性能和稳定性。
与其他工具和技术的集成,可以实现更高效和灵活的搜索解决方案。
Solr查询参数及检索运算符
==============================================
[Solr查询参数说明备忘]
常用
--------------------------------------------
roam~0.8,检索返回相似度在0.8以上的记录。
5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,
那么在其后加上”^”符号和增量值,即jakarta^4 apache
•fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,
例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。
官方文档:/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758577506d6002
13. {} 不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
14. \ 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : \
solr 查询参数说明
发表于:2009年3月25日 | 分类:Solr | 标签: query, solr | views(5,140)
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自己进行封装实现站内搜索。
Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)
Solr4:查询参数fq的⽤法(对结果进⾏过滤;两组关键词组合查询)Solr查询参数⽂档可以参考:这⾥主要说⼀下fq参数的使⽤。
1. 需求⼀搜索商户信息时,已经可以按指定关键词搜索;但有时需要缩⼩范围,⽐如在江苏省范围搜索,或者是苏州市范围内搜索。
注意:不是指记录包含“江苏省”、"苏州市“关键词的,⽽是此记录的⾏政区域属性值是属于”江苏省“或者是”苏州市"的。
2. 实现⼀1). schema.xml定义如下:<field name="detail_id" type="string" indexed="true" stored="true" required="true" multiValued="false"/><field name="category_id" type="int" indexed="true" stored="true" required="true"/><field name="province_id" type="int" indexed="true" stored="true" required="true"/><field name="district_id" type="int" indexed="true" stored="true" required="true"/>这些编号应该是不需要分词、需要索引、是否存储视情况⽽定;我这⾥设计为需要存储,并且设计为不能为空。
solr模糊查询
solr模糊查询今天重点讲模糊检索中文名字solr对中文进行分词,如果不是一个词,可能会丢失字,然后在查询名字的,会感觉不太准确。
solr里面提供了很多查询匹配的方法例如:1.使用*:resume_keyword:*王*2.使用AND 拼接查询 keywords:*建筑* AND personName:*王*3.OR keyword:建筑 OR personName:王4. 否: AND resume_keyword:(* NOT *李*) 上面的都是用拼接的,也可以用过滤query.addFilterQuery(" per_name:(*李* )");5.名字匹配法:之前做搜索的时候,名字设置成了分词,然后分词结果不太准确,比如:ABC,它可能分成了AB 然后没有C,所以你在查询的时候,就查不到ABC。
之前的分词是IK<fieldType name="text_ik" class="solr.TextField"><analyzer type="index" class="org.wltea.analyzer.lucene.IK Analyzer"/><analyzer type="query" class="org.wltea.analyzer.lucene.IK Analyzer"/></fieldType>出现了上述问题,然后我们研究了一下schema.xml里面的属性类型,之前用text_ik,改成了text_general,这样它就可以把ABC 分成了A,B,C 通过一个其中的一个字或者ABC都可以检索了,就不用上面的模糊匹配了,就算匹配了,也不太准,可能把自己需要的那一行数据放到了第七八行,而不是第一行。
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查询参数使用说明
solr查询参数使用说明q –查询字符串,必须的。
Solr 中用来搜索的查询。
有关该语法的完整描述,请参阅参考资料中的“Lucene QueryParser Syntax”。
可以通过追加一个分号和已索引且未进行断词的字段的名称来包含排序信息。
默认的排序是score desc,指按记分降序排序。
q=myField:Java AND otherField:developerWorks; date asc此查询搜索指定的两个字段并根据一个日期字段对结果进行排序。
start –返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows –指定返回结果最多有多少条记录,配合start 来实现分页。
sort –排序,格式:sort=<fieldname>+<desc|asc>[,<fieldname>+<desc|asc>]…。
示例:(inStock desc, price asc)表示先“inStock”降序, 再“price”升序,默认是相关性降序。
wt –(writer type)指定输出格式,可以有xml, json, php, phps, 后面solr 1.3增加的,要用通知我们,因为默认没有打开。
fq –(filter query)过虑查询,作用:在q 查询符合结果中同时是fq查询符合的,fl- field作为逗号分隔的列表指定文档结果中应返回的Field 集。
默认为“*”,指所有的字段。
“score”指还应返回记分。
例如*,score将返回所有字段及得分。
用solrj的bean时,得在query中指定query.set("fl", "*,score");q.op –覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定df –默认的查询字段,一般默认指定qt –(query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
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 post用法
Solr Post用法
Solr是一个基于Lucene的开源搜索服务器,它提供了强大的全文搜索功能和灵活的查询方式。
Solr Post是一种向Solr服务器发送查询请求的方法,它可以用于搜索和检索文档。
Solr Post用法如下:
1.准备查询参数:在发送POST请求之前,您需要准备查询参数。
这些参数包
括要搜索的字段、查询字符串、过滤条件等。
您可以使用JSON格式来定义查询参数。
例如:
在上面的示例中,"q"表示要搜索的查询字符串,"fq"表示过滤条件,"start"表示要返回的结果的起始位置,"rows"表示要返回的结果的数量。
2.发送POST请求:一旦您准备好了查询参数,就可以使用HTTP POST请求将
它们发送到Solr服务器。
您可以使用任何支持HTTP POST请求的编程语言或工具来完成此操作。
例如,如果您使用Python,可以使用requests库来发送POST请求:
在上面的示例中,我们使用requests库发送POST请求到Solr服务器的"/sel ect"端点,并将查询参数作为JSON数据发送。
响应将包含Solr服务器返回的结果。
3.处理响应:一旦您接收到响应,就可以处理它以获取搜索结果。
响应将包含
一个JSON对象,其中包含有关搜索结果的信息,例如匹配的文档数量、每个文档的字段值等。
您可以根据需要解析和处理响应数据。
例如,如果您使用Python,可以使用json库来解析响应:。
solr创建索引并查询
功能:使用SolrJ组件实现简单的创建索引,建立查询功能。
代码:1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041 package com.clzhang.sample.solr;import java.io.*;import java.util.*;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import mon.SolrDocument;import mon.SolrDocumentList;import mon.SolrInputDocument;import mon.params.ModifiableSolrParams;import org.junit.After;import org.junit.Before;import org.junit.Test;/*** 此类是测试SolrJ组件使用的类,包括:单条插入索引,多条插入索引,简单查询,复杂等* @author Administrator**/public class SlorJTest {private static final String DEFAULT_URL ="http://localhost:8080/solr/news";private HttpSolrServer server;@Beforepublic void init(){server =new HttpSolrServer(DEFAULT_URL);server.setMaxRetries(1);// defaults to 0. > 1 not recommende server.setConnectionTimeout(5000);// 5 seconds to establish// Setting the XML response parser is only required for cross// version compatibility and only when one side is 1.4.1 or4243444546474849505152535455565758596061626364656667686970717273747576777879808182838485// earlier and the other side is 3.1 or later.// server.setParser(new XMLResponseParser()); // binary parser// by default// The following settings are provided here for completeness.// They will not normally be required, and should only be use// after consulting javadocs to know whether they are truly re server.setSoTimeout(1000);// socket read timeoutserver.setDefaultMaxConnectionsPerHost(100);server.setMaxTotalConnections(100);server.setFollowRedirects(false);// defaults to false// allowCompression defaults to false.// Server side must support gzip or deflate for this to have any server.setAllowCompression(true);// SolrJ lets you upload content in XML and Binary format.// The default is set to be XML.// Use the following to upload using Binary format.// This is the same format which SolrJ uses to fetch results, // greatly improve performance as it reduces XML marshalling ov // Note -- be sure you have also enabled the// "BinaryUpdateRequestHandler" in your solrconfig.xml for examp// <requestHandler name="/update/javabin"// class="solr.BinaryUpdateRequestHandler" />// server.setRequestWriter(new BinaryRequestWriter());}@Afterpublic void destory(){server =null;System.runFinalization();System.gc();}/*** 获取查询结果,直接打印输出* @param query*/public void query(String query){SolrQuery params =new SolrQuery(query);params.set("rows", 5);try{86 87 88 8990 9192 93 94 95 96 97 98 99 100101102103 104105106107 108109110 111112113 114115116 117118119120 121122 123124 125126 127128129QueryResponse response = server.query (params );SolrDocumentList list = response.getResults ();System .out .println ("总计:" + list.getNumFound () + "条,本批list.size () + "条"); for (int i = 0; i < list.size (); i ++) {SolrDocument doc = list.get (i );System .out .println (doc.get ("webTitle"));}} catch (SolrServerException e ) {e.printStackTrace ();}}@Test public void addDoc () { // 创建doc 文档 SolrInputDocument doc = new SolrInputDocument (); doc.addField ("objectId", 0); doc.addField ("webTitle", "测试标题"); doc.addField ("webTime", new java.util .Date ()); doc.addField ("webContent", "这是一条测试内容"); try { // 添加一个doc 文档 UpdateResponse response = server.add (doc ); // commit 后才保存到索引库 mit (); // 输出统计信息 System .out .println ("Query Time :" + response.getQTime ()); System .out .println ("Elapsed Time :" + response.getElapsedT System .out .println ("Status :" + response.getStatus ()); } catch (SolrServerException e ) { e.printStackTrace ();130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 }catch(IOException e){e.printStackTrace();}System.out.println("--------------------------");query("测试");System.out.println("--------------------------");}@Testpublic void addDocs(){String[] title =new String[]{"IK Analyzer介绍", "观前街介绍",情况","人大动态", "高技能"};String[] content =new String[]{"IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。
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全文检索_初级教程
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 开头的单词。
filter 多条件查询用法
filter 多条件查询用法
在查询语句中使用 filter 子句进行多条件查询,可以通过使用AND 运算符将多个条件连接在一起。
例如:
SELECT * FROM table_name
WHERE condition1 AND condition2;
这样可以将多个条件组合起来,并且只返回满足所有条件的行。
这里的 condition1 和 condition2 可以是任何合法的 SQL 条件表达式,可以包括列名、比较操作符、常量等。
下面是一个具体的例子:
SELECT * FROM customers
WHERE age > 18 AND nationality = 'USA';
这个查询语句会返回所有年龄大于18岁且国籍为美国的顾客
的信息。
除了使用 AND 运算符,还可以使用 OR 运算符将多个条件连
接在一起。
例如:
SELECT * FROM table_name
WHERE condition1 OR condition2;
这样将返回满足其中一个条件的行。
以上是在查询语句中使用 filter 多条件查询的用法。
可以根据
具体的需求,使用不同的条件和运算符来获取所需的结果。
es的filter查询用法
es的filter查询用法ES(Elasticsearch)是一个开源的分布式搜索引擎,它提供了丰富的查询语言和API,其中filter查询是ES中常用的一种查询方式。
本文将介绍ES的filter查询用法。
一、什么是filter查询filter查询是ES中一种基于条件过滤的查询方式,它可以根据指定的条件过滤出符合条件的文档,与查询语句不同的是,filter查询不会计算文档的相关性得分,因此它的查询速度更快。
二、filter查询的语法filter查询的语法格式如下:```{"query": {"bool": {"filter": [{"term": {"field1": "value1"}},{"range": {"field2": {"gte": "value2","lte": "value3"}}}]}}}```其中,query表示查询语句,bool表示布尔查询,filter表示过滤条件,term表示精确匹配,range表示范围匹配,gte表示大于等于,lte表示小于等于。
三、filter查询的示例下面是一个使用filter查询的示例:假设有一个名为“books”的索引,其中包含了书籍的信息,包括书名、作者、出版社、出版日期等字段。
现在要查询出所有出版日期在2010年之后,且作者为“张三”的书籍。
查询语句如下:```{"query": {"bool": {"filter": [{"range": {"publish_date": {"gte": "2010-01-01"}}},{"term": {"author": "张三"}}]}}}```其中,range过滤条件表示出版日期在2010年之后,term过滤条件表示作者为“张三”。