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+facet学习笔记
SOLR FACET学习笔记修改记录目录一.FACET简介 (3)二.FACET字段 (3)1.适宜被F ACET的字段 (3)2.F ACET字段的要求 (3)3.特殊情况 (3)三.FACET组件 (4)四.FACET查询 (4)1.F IELD F ACET (4)1.1facet.prefix (7)1.2facet.sort (7)1.3facet.limit (7)1.4facet.offset (8)1.5facet.mincount (8)1.6facet.missing (8)1.7facet.method (8)1.8facet.enum.cache.minDf (8)2.D ATE F ACET (8)2.1facet.date (8)2.2facet.date.start (8)2.3facet.date.end (8)2.4facet.date.gap (8)2.5facet.date.hardend (8)2.6facet.date.other (9)3.F ACET Q UERY (10)4.KEY操作符 (12)5.TAG操作符和EX操作符 (14)五.SOLRJ对FACET的支持 (17)一.Facet简介Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计.二.Facet字段1.适宜被Facet的字段一般代表了实体的某种公共属性,如商品的分类,商品的制造厂家,书籍的出版商等等.2.Facet字段的要求Facet的字段必须被索引.一般来说该字段无需分词,无需存储.无需分词是因为该字段的值代表了一个整体概念,如电脑的品牌”联想”代表了一个整体概念,如果拆成”联”,”想”两个字都不具有实际意义.另外该字段的值无需进行大小写转换等处理,保持其原貌即可.无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,用户一般会沿着这个分组进一步深入搜索.3.特殊情况对于一般查询而言,分词和存储都是必要的.比如CPU类型”Intel 酷睿2双核P7570”,拆分成”Intel”,”酷睿”,”P7570”这样一些关键字并分别索引,可能提供更好的搜索体验.但是如果将CPU作为Facet字段,最好不进行分词.这样就造成了矛盾,解决方法为,将CPU字段设置为不分词不存储,然后建立另外一个字段为它的COPY,对这个COPY的字段进行分词和存储.schema.xml三.Facet组件Solr的默认requestHandler(ponent.SearchHandler)已经包含了Facet组件(ponent.FacetComponent).如果自定义requestHandler或者对默认的requestHandler自定义组件列表,那么需要将Facet加入到组件列表中去.solrconfig.xml四.Facet查询进行Facet查询需要在请求参数中加入”facet=on”或者”facet=true”只有这样Facet组件才起作用.1.Field FacetFacet字段通过在请求中加入”facet.field”参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如返回结果:各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独的Facet字段.应用于单独的字段时通过这种方式调用.比如facet.prefix参数应用于cpu字段,可以采用如下形式1.1facet.prefix表示Facet字段值的前缀.比如”facet.field=cpu&facet.prefix=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”AMD”开头的cpu型号将不会被统计在内.1.2facet.sort表示Facet字段值以哪种顺序返回.可接受的值为true(count)|false(index,lex).true(count)表示按照count值从大到小排列. false(index,lex)表示按照字段值的自然顺序(字母,数字的顺序)排列.默认情况下为true(count).当facet.limit值为负数时,默认facet.sort= false(index,lex).1.3facet.limit限制Facet字段返回的结果条数.默认值为100.如果此值为负数,表示不限制.1.4facet.offset返回结果集的偏移量,默认为0.它与facet.limit配合使用可以达到分页的效果.1.5facet.mincount限制了Facet字段值的最小count,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.1.6facet.missing默认为””,如果设置为true或者on,那么将统计那些该Facet字段值为null的记录.1.7facet.method取值为enum或fc,默认为fc.该字段表示了两种Facet的算法,与执行效率相关.enum适用于字段值比较少的情况,比如字段类型为布尔型,或者字段表示中国的所有省份.Solr会遍历该字段的所有取值,并从filterCache里为每个值分配一个filter(这里要求solrconfig.xml里对filterCache的设置足够大).然后计算每个filter 与主查询的交集.fc(表示Field Cache)适用于字段取值比较多,但在每个文档里出现次数比较少的情况.Solr会遍历所有的文档,在每个文档内搜索Cache内的值,如果找到就将Cache 内该值的count加1.1.8facet.enum.cache.minDf当facet.method=enum时,此参数其作用,minDf表示minimum document frequency.也就是文档内出现某个关键字的最少次数.该参数默认值为0.设置该参数可以减少filterCache的内存消耗,但会增加总的查询时间(计算交集的时间增加了).如果设置该值的话,官方文档建议优先尝试25-50内的值.2.Date Facet日期类型的字段在文档中很常见,如商品上市时间,货物出仓时间,书籍上架时间等等.某些情况下需要针对这些字段进行Facet.不过时间字段的取值有无限性,用户往往关心的不是某个时间点而是某个时间段内的查询统计结果. Solr为日期字段提供了更为方便的查询统计方式.当然,字段的类型必须是DateField(或其子类型).需要注意的是,使用Date Facet时,字段名,起始时间,结束时间,时间间隔这4个参数都必须提供.与Field Facet类似,Date Facet也可以对多个字段进行Facet.并且针对每个字段都可以单独设置参数.2.1facet.date该参数表示需要进行Date Facet的字段名,与facet.field一样,该参数可以被设置多次,表示对多个字段进行Date Facet.2.2facet.date.start起始时间,时间的一般格式为”1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具体格式可以参考org.apache.solr.schema.DateField的java doc.2.3facet.date.end结束时间.2.4facet.date.gap时间间隔.如果start为2009-1-1,end为2010-1-1.gap设置为”+1MONTH”表示间隔1个月,那么将会把这段时间划分为12个间隔段.注意”+”因为是特殊字符所以应该用”%2B”代替.2.5facet.date.hardend取值可以为true|false,默认为false.它表示gap迭代到end处采用何种处理.举例说明start为2009-1-1,end为2009-12-25,gap为”+1MONTH”,hardend为false的话最后一个时间段为2009-12-1至2010-1-1;hardend为true的话最后一个时间段为2009-12-1至2009-12-25.2.6facet.date.other取值范围为before|after|between|none|all,默认为none.before会对start之前的值做统计.after会对end之后的值做统计.between会对start至end之间所有值做统计.如果hardend为true的话,那么该值就是各个时间段统计值的和.none表示该项禁用.all表示before,after,all都会统计.举例:返回结果:3.Facet QueryFacet Query利用类似于filter query的语法提供了更为灵活的Facet.通过facet.query 参数,可以对任意字段进行筛选.例1:返回结果:例2:返回结果:例3:返回结果:4.key操作符可以用key操作符为Facet字段取一个别名.例:返回结果:5.tag操作符和ex操作符当查询使用filter query的时候,如果filter query的字段正好是Facet字段,那么查询结果往往被限制在某一个值内.例:返回结果:可以看到,屏幕尺寸(screenSize)为14寸的产品共有107件,其它尺寸的产品的数目都是0,这是因为在filter里已经限制了screenSize:14.这样,查询结果中,除了screenSize=14的这一项之外,其它项目没有实际的意义.有些时候,用户希望把结果限制在某一范围内,又希望查看该范围外的概况.比如上述情况,既要把查询结果限制在14寸屏的笔记本,又想查看一下其它屏幕尺寸的笔记本有多少产品.这个时候需要用到tag和ex操作符.tag就是把一个filter标记起来,ex(exclude)是在Facet的时候把标记过的filter排除在外.例:返回结果:这样其它屏幕尺寸的统计信息就有意义了.五.SolrJ对Facet的支持。
solr完整快速搭建版(学习笔记)
Solr学习笔记由于公司一个网站需要实现搜索功能的更新换代,在和编辑和领导沟通了一段时间之后,我们决定不再使用之前的通过JDBC发送sql语句进行搜索的方法。
一番比较,我们决定选用Lucene来搭建我们全文搜索的框架。
后来由于开发时间有限,Solr对lucene的集成非常好,我们决定使用Struts+Spring+Solr+IKAnalyzer的一个开发模式来快速搭建一个企业级搜索平台。
自己之前没有接触过这方面的东西,从不断看网上的帮助文档,逛论坛,逛wiki,终于一点一点的开发出一个有自己风格并又适合公司搜索要求的这么一个全文搜索功能。
网上对于lucene,solr的资料并不是那么多,而且大多是拷贝再拷贝,开发起来难度是有的,项目缺陷也是有的,但是毕竟自己积累了这么一个搭建小型搜索引擎的经验,很有收获,所以准备写个笔记记录下来,方便自己以后回忆,而且可以帮助一下其他学者快速搭建一个企业级搜索。
主要思想:此企业级搜索分2块,一块是Solr项目:仅关于Solr一系列配置,索引,建立/更新索引配置。
另一块是网站项目:Action中通过httpclient通信,类似webService一个交互实现,访问配置完善并运行中的Solr,发送查询请求,得到返回的结果hits(solrJ查询,下面详解),传递给jsp页面。
1.下载包Lucene3.5Solr3.5IKAnalyzer3.2.8中文分词器(本文也仅在此分词器配置的基础上)开发时段:2011.12中旬至1月中旬(请自己下载…)都是最新版,个人偏好新东西,稳定不稳定暂不做评论。
2.搭建Solr项目:1.apache-solr-3.5.0\dist下得apache-solr-3.5.0.war复制到tomcat下webapps目录,并更改名字为solr.war,运行生成目录.2.将IKAnalyzer的jar包导入刚生成的项目中lib目录下。
3.Solr项目配置中文分词:在solr/conf/schema.xml中<types>节点下添加个<fieldType>类型(可直接拷贝下段代码)<!--hu add IKAnalyzer configuration--><fieldType name="textik" class="solr.TextField" ><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKT okenizerFactory"isMaxWordLength="false"/><filter class="solr.StopFilterFactory"ignoreCase="true" words="stopwords.txt"/><filter class="solr.WordDelimiterFilterFactory"generateWordParts="1"generateNumberParts="1"catenateWords="1"catenateNumbers="1"catenateAll="0"splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.EnglishPorterFilterFactory"protected="protwords.txt"/><filter class="solr.RemoveDuplicatesT okenFilterFactory"/></analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKT okenizerFactory" isMaxWordLength="false"/><filter class="solr.StopFilterFactory"ignoreCase="true" words="stopwords.txt"/><filter class="solr.WordDelimiterFilterFactory"generateWordParts="1"generateNumberParts="1"catenateWords="1"catenateNumbers="1"catenateAll="0"splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.EnglishPorterFilterFactory"protected="protwords.txt"/><filter class="solr.RemoveDuplicatesT okenFilterFactory"/></analyzer></fieldType>此配置不过多解释:<analyzer type="query">此处配置type并分成index和query 代表着在索引和查询时候的分词实现,isMaxWordLength表示是以何种分词实现,true,false各代表一种,具体请看IKAnalyzer说明文档。
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为基础构建全文检索引擎。
Nutch相关框架视频教程(Hadoop、Hbase、Lucene、Solr、Tika、Gora)(13-20讲)
第十三讲1、改变负载三台机器,改变负载host2(NameNode、DataNode、TaskTracker)host6(SecondaryNameNode、DataNode、TaskTracker)host8(JobTracker 、DataNode、TaskTracker)指定SecondaryNameNode为host6:vi conf/masters指定host6scp conf/masters host6:/home/hadoop/hadoop-1.1.2/conf/mastersscp conf/masters host8:/home/hadoop/hadoop-1.1.2/conf/mastersvi conf/hdfs-site.xml<property><name>dfs.http.address</name><value>host2:50070</value></property><property><name>dfs.secondary.http.address</name><value>host6:50090</value></property>scp conf/hdfs-site.xml host6:/home/hadoop/hadoop-1.1.2/conf/hdfs-site.xmlscp conf/hdfs-site.xml host8:/home/hadoop/hadoop-1.1.2/conf/hdfs-site.xml指定JobTracker为host8:vi conf/mapred-site.xml<property><name>mapred.job.tracker</name><value>host8:9001</value></property>scp conf/mapred-site.xml host6:/home/hadoop/hadoop-1.1.2/conf/mapred-site.xml scp conf/mapred-site.xml host8:/home/hadoop/hadoop-1.1.2/conf/mapred-site.xml vi conf/core-site.xml<property><name>fs.checkpoint.dir</name><value>/home/hadoop/dfs/filesystem/namesecondary</value></property>scp conf/core-site.xml host6:/home/hadoop/hadoop-1.1.2/conf/core-site.xmlscp conf/core-site.xml host8:/home/hadoop/hadoop-1.1.2/conf/core-site.xml配置host8:host8上的脚本start-mapred.sh会启动host2和host6上面的TaskTracker,所以需要对host8执行:ssh-keygen -t rsa(密码为空,路径默认)ssh-copy-id -i .ssh/id_rsa.pub hadoop@host2ssh-copy-id -i .ssh/id_rsa.pub hadoop@host6ssh-copy-id -i .ssh/id_rsa.pub hadoop@host8可以在host8上面通过ssh无密码登陆host2和host6ssh host2ssh host6ssh host8在/home/hadoop/.bashrc 中追加:export PATH=/home/hadoop/hadoop-1.1.2/bin:$PATHhost2: 执行start-dfs.shhost8: 执行start-mapred.sh2、SecondaryNameNodessh host6停止secondarynamenodehadoop-1.1.2/bin/hadoop-daemon.sh stop secondarynamenode强制合并fsimage和eidtshadoop-1.1.2/bin/hadoop secondarynamenode -checkpoint force启动secondarynamenodehadoop-1.1.2/bin/hadoop-daemon.sh start secondarynamenode3、启用回收站<property><name>fs.trash.interval</name><value>10080</value></property>1、动态增加DataNode节点和TaskTracker节点以host226为例在host226上执行:指定主机名vi /etc/hostname指定主机名到IP地址的映射vi /etc/hosts增加用户和组addgroup hadoopadduser --ingroup hadoop hadoop更改临时目录权限chmod 777 /tmp在host2上执行:vi conf/slaves增加host226ssh-copy-id -i .ssh/id_rsa.pub hadoop@host226scp -r /home/hadoop/hadoop-1.1.2 hadoop@host226:/home/hadoop/hadoop-1.1.2在host8上执行:vi conf/slaves增加host226ssh-copy-id -i .ssh/id_rsa.pub hadoop@host226在host226上面执行:hadoop-daemon.sh start datanodehadoop-daemon.sh start tasktracker在/etc/hosts的配置文件中,localhost到ip地址的映射要放到ipv4的最后面1、限制hadoop节点连接NameNode:vi conf/hdfs-site.xml<property><name>dfs.hosts</name><value>/home/hadoop/hadoop-1.1.2/conf/include</value></property><property><name>dfs.hosts.exclude</name><value>/home/hadoop/hadoop-1.1.2/conf/exclude</value></property>加入集群节点vi /home/hadoop/hadoop-1.1.2/conf/includeJobTracker:vi conf/mapred-site.xml<property><name>mapred.hosts</name><value>/home/hadoop/hadoop-1.1.2/conf/include</value></property><property><name>mapred.hosts.exclude</name><value>/home/hadoop/hadoop-1.1.2/conf/exclude</value></property>加入集群节点vi /home/hadoop/hadoop-1.1.2/conf/include重启集群2、动态删除DataNode节点和TaskTracker节点vi /home/hadoop/hadoop-1.1.2/conf/exclude增加待删除的节点host226在NameNode上面执行:hadoop dfsadmin -refreshNodesvi hadoop-1.1.2/conf/slaves (去掉host226)vi hadoop-1.1.2/conf/include (去掉host226)hadoop dfsadmin -refreshNodes(使include的更改生效) rm hadoop-1.1.2/conf/excludeexclude主要是使一个datanode节点安全退役删除tasktracker方式一:vi /home/hadoop/hadoop-1.1.2/conf/exclude增加待删除的节点host226在JobTracker上面执行:hadoop mradmin -refreshNodesvi hadoop-1.1.2/conf/slaves (去掉host226)vi hadoop-1.1.2/conf/include (去掉host226)hadoop mradmin -refreshNodes(使include的更改生效) rm hadoop-1.1.2/conf/exclude删除tasktracker方式二:vi /home/hadoop/hadoop-1.1.2/conf/include删除待删除的节点host226在JobTracker上面执行:hadoop mradmin -refreshNodesvi hadoop-1.1.2/conf/slaves (去掉host226)1、运行基准测试hadoop jar hadoop-test-1.1.2.jarhadoop jar hadoop-test-1.1.2.jar DFSCIOTest -write -nrFiles 12 -fileSize 100000 -resFile test hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -read -nrFiles 12 -fileSize 100000 -resFile test hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -clearGanglia主要是用来监控大规模分布式系统的性能,如:cpu 、内存、硬盘、负载、网络流量等。
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集群搭建
solrcloud集群搭建1什么是SolrCloud1.1什么是SolrCloudSolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。
当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
1.2SolrCloud结构SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。
实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud 需要由多台服务器组成,由zookeeper来进行协调管理。
下图是一个SolrCloud应用的例子:对上图进行图解,如下:1.2.1物理结构三个Solr实例(每个实例包括两个Core),组成一个SolrCloud。
1.2.2逻辑结构索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard 上三个Core的索引数据一致,解决高可用问题。
用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。
1.2.2.1c ollectionCollection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。
它常常被划分为一个或多个Shard(分片),它们使用相同的配置信息。
比如:针对商品信息搜索可以创建一个collection。
collection=shard1+shard2+....+shardX1.2.2.2C ore每个Core是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自己进行封装实现站内搜索。
Solrj操作Solr4
Solrj操作Solr4.0 中CloudSolrServer的一般过程一、准备工作:创建eclipse工程1. 下载solr4.0_src的源码包,解压后,进入目录中,在命令行执行:ant eclipse 则可以生成一个eclipse工程,会在目录中多了关于eclipse工程的文件:.classpath 和 .project;在eclipse导入该生成的工程(lucene-solr),工程名为lucene-solr,可以看到其全部源码;编写自己的代码,就能测试了!注意:需要安装ant 工具,以及ivy包,搜一下,去appache下来,配置好,才能编译通过。
Ant编译时间有点长。
关于ant(another neat tool)不再过多介绍,网上有很多教程。
只要明白ant相当于一个make的工具,其解析biuld.xml文件的相关指令。
2. 下载solr4.0 zip 包,将其中的所有jar包都添加你的eclipse工程中。
(之所以是所有,以防万一编译不过,省的猜缺少那个包,找呀找的!)3. 结合网上关于solr的搭建教程,进行搭建solr,可以用tomcat,也可以用jetty。
我用的jetty+zookeeper,(由于对tomcat的集群配置不了解),zookeeper是独立的zookeeper,而不是jetty内嵌的zookeeper;可以从appache上直接下载!4. 进行相关集群的配置,配置集群,用在工程中用solrj操纵solrCloud二、用solrj操纵CloudSolrServer的一般步骤1. 创建CloudSolrServer的实例:2种方式:(a) CloudSolrServer cloudSolrServer= new CloudSolrServer(zkHostURL);(b) CloudSolrserver.cloudSolrServer = newCloudSolrServer(zkHostURL,lbHttpSolrServer);2. 对CloudSolrServer实例进行设置(a) cloudSolrServer.setDefaultCollection(defaultCollectionName);(b) cloudSolrServer.setzkClientTimeout(zkClientTimeout);(c) cloudSolrServer.setzkConnectTimeout(zkConnectionTimeout);3. 将cloudSolrServer实例连接到zookeeper(a) cloudSolrServer.connect();4. CloudSolrServer 的实例cloudSolrServer 实例化、连接完成,进而可以对其进行add、query、delete操作。
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)。
Dynamic Fields
copyField
将多个field的数据放在一起同时搜索,提供速度 将一个field的数据拷贝到另一个,可以用2种不同的方式来建立 索引。
/blog/1664127
java -Dsolr.solr.home=solr/ -jar start.jar
Solr管理界面介绍
solr管理界面地址
http://localhost:8983/solr
Solr example
介绍solr example
hl高亮
hl.fl:用空格或逗号隔开的字段列表
hl.simple.pre:前缀 hl.simple.post:后缀
注意:要启用某个字段的高亮功能,需要保 证这个字段在schema中是store。
ቤተ መጻሕፍቲ ባይዱ
高亮需要注意的问题
对于multiValued=true的字段不要设计高 亮显示
STOP.PORT和STOP.KEY还可以去solrui界面 的java properties栏目中找
Solr启动(2)
solr命令讲解(solr-4.10.4/bin/solr)
start, stop, restart, healthcheck solr start -help solr start [-f]:启动solr,默认后台运行 solr start -p <port>:指定solr实例端口 solr start -s <dir>:指定solr的solr.solr.home solr start -d <dir>:指定solrweb项目根路径(项目根 路径下必须有webapps/solr.war) solr -p <port> -V:查看指定solr的运行基本信息 solr -i:查看有多少solr服务正在运行 solr stop -p <port>:停止运行在指定端口的solr服务 solr stop -all:停止所有solr服务
/dist/lucene/solr/4.10.4/
solr文档:
/dist/lucene/solr/ref-guide/ /solr/4_10_0/tutorial.html
Config Analysis
Schema
Caching
Solr Core
Concurrency
Update Handler
Lucene
Replicatio
8
solr的应用
Solr文档
solr官方网站
/solr/
solr下载(v4.10.4)
Solr Scheme分析
fieldType
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" /> name:标识而已,并不是java中的String
class和其他属性决定了这个fieldType的实际行为
分析solr查询界面功能
参数 q fq sort start rows fl df wt 代表query input 对q的查询结果进行过滤 排序 相当于pagenum 相当与pagesize 指定返回那些字段内容,用逗号或空格 分隔多个。 id,name 在solrconfig.xml中843行 在schema.xml中258行 可以有 xml, json... 描述 备注 id:SOLR1000 price:[0 TO 100] id desc 表示 id 降序 price desc,id desc
cd \solr-4.10.2\example\exampledocs *xml 内容查看 将*.xml上传到solr服务器
java -jar post.jar *.xml
post.sh *.xml
使用管理页面查询
Solr Scheme分析
Field
name:字段名 type:之前定义过的各种FieldType indexed:是否被索引 stored:是否被存储(如果不需要存储相应字段值,尽量设为false) multiValued:是否有多个值(对可能存在多值的字段尽量设置为true, 避免建索引时抛出错误)
solr课程
图书目录
solr简介
solr是一个基于lucene的搜索引擎,可以实现全文搜索。 它对外提供类似于Web-service的API接口,可以通过 http请求进行操作。 solr可以很方便的实现一个站内搜索功能 (/中的搜索)
Solr历史
Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源, 分布式的搜索引擎.,设计用于云计算中,能够实现实时搜索。 官方主页:/
Elasticsearch
solr的特点
通过HTTP协议处理搜索和查询请求。 增加了缓存,让响应速度更快。 提供了一个基于web的管理界面 查询结果分类(facet) 支持分布式,支持大规模的部署 (solrcloud)(Solr4.0版本开始)
第二步
第三步 export
第四步
JAVA_OPTS="/usr/local/solr-tomcat/solr"
第五步
配置日志,如果不配置的话,启动会报错,无法访问solr平台,查看 localhost.2015-01-01.log日志。 把solr-4.10.4\example\lib\ext目录下的jar包都拷贝到tomcat的lib 目录下即可。
4
全文搜索的工具
Lucene
Java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标 准的全文检索程序,它提供了完整的查询引擎和索引引擎,没有中 文分词引擎,需要自己去实现。
官方主页:/
solr
Solr是一个用java开发的独立的企业级搜索应用服务器,它提供 了类似于Web-service的API接口,它是基于Lucene的全文检索 服务器 官方主页:/solr/
solr启动(3)仅适用于linux
第一步
建立一个solr的运行目录 例如:在/usr/local目录下建立solr-tomcat 将下载的solr-4.10.4中的solr-4.10.4\example目录下的solr文 件夹拷贝到/usr/local/solr-tomcat目录下 把solr-4.10.4中dist目录中的solr-4.10.4.war包拷贝到tomcat 的根目录下,名字改为solr.war
Solr目录结构
solr依赖环境
必须是jdk1.7或以上
solr启动(1)
tar -zxvf solr-4.10.4.tgz cd solr-4.10.4\example java -jar start.jar 后台启动:java -DSTOP.PORT=8984 DSTOP.KEY=solr -jar start.jar --daemon & 停止:java -DSTOP.PORT=8984 DSTOP.KEY=solr -jar start.jar --stop
Solr 查询参数之 fq (Filter Query)
fq 值是一个查询,用于过滤查询结果,在负责 查询时,可以很好的提高查询效率,fq 查询的 内容会被缓存着,下次使用相同的过滤查询时, 可以从缓存中命中。 使用 fq 参数时需要注意以下几点
在一个查询中,fq 参数可以设置多次。结果中将返回 这些过滤条件的交集 过滤查询的结果将被分别缓存 使用filter query可以充分利用filter query cache,提 高检索性能。
使用solr start 命令启动,默认指定solr/目录,可 以用过-s <path> 指定配置文件目录 使用tomcat启动则需要修改solr项目的web.xml文 件或者添加JNDI文件(或者使用export命令定义 solr.solr.home,仅适用于linux环境) 设置solr.solr.home的几种方式
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
solr.TextField 允许用户通过分析器来定制索引和查询,分析器 包括 一个分词器(tokenizer)和多个过滤器(filter) positionIncrementGap:可选属性,定义在同一个文档中此 类型数据的空白间隔,避免短语匹配错误。
Lucene 架构
7
solr的架构
HTTP Request Servlet Admin Interface Update Servlet XML Update Interface
Standard Request Handler
Custom Request Handler
XML Response Writer
访问http://localhost:8080/solr/
solr.solr.home目录
solr.solr.home指solr core的配置文件的根目录 Solr启动的时候会检查solr.solr.home的Java系 统属性,如果没找到的话默认指定solr/目录 使用java -jar start 启动的时候可以通过下面方 式指定
默认的查询字段,默认是text 使用solrConfig中的df属性代替schema中 的defaultSearchField