barriers / 阅读 / 详情

elasticsearch,solr对比各自有哪些优缺点

2023-08-25 03:00:57
共1条回复
小菜G

从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。

单机对比

1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 3092730 条记录,约合 3682条/秒。

2. 3百万条记录的情况下,模糊查询和排序基本都在1秒内返回

3. 刚才的测试,是每个field单独存储,现在修改了一下配置文件,增加了一个copyField,所有的field都拷贝一份到text这个field里面去,导入的性能大概是:19分钟导入了3092730 条记录,约合 2713条/秒

4. 3百万条记录的情况下,针对text的模糊查询基本在1秒内返回,但是针对所有记录的排序,大概要2~3秒

5. 使用 elasticsearch 0.19.8,缺省配置,用单任务导入,导入性能是:20分钟导入了3092730 条记录,约合2577条/秒

6. 3百万条记录的情况下,查询基本上在1秒内返回,但是模糊查询比较慢,第一次要10秒,后来大概要1~3秒。加上排序大概需要5秒,整体排序基本100ms

查询及排序的指令:

{

"query": {

"query_string": {

"query": "*999*"

}

},

"sort": [

{

"TIME_UP": {

"order": "asc"

}

}

]

}

7. Es0.19.8,用两个任务导入,导入性能是:13分钟导入了3092730 条记录,约合3965条/秒

8. Solr全部建好索引后,占用磁盘空间是1.2G,es占用磁盘空间是4G

单机对比2

在一台Intel i7,32G内存的机器上,重新跑这两个的对比。不过有个重大的区别在于,Solr是在这台性能很好的机器上跑,而es的导入进程则是在一台Intel 四核 2.5G,4G内存的机器上跑的,也许会有性能的差异。ES版本0.19.8,Solr版本4.0-ALPHA。

1. Solr的导入性能:3400万条记录,用时62分钟,平均9140条/秒,占用空间12.75G

2. 使用 *999* 这样的模糊查询,3秒以内返回,稍长一点的查询条件 *00100014*,也是2~3秒返回

3. Es的导入性能(设置Xmx为10G):3400万条记录,用时40分钟,平均14167条/秒,占用空间33.26G,客户端采用4个并发。

4. 使用 *999* 这样的模糊查询,9秒返回,稍长一点的查询条件 *00100014*,11.8秒返回

5. 如果不是针对所有字段查询,而是针对某个特定字段,比如 SAM_CODE: *00100014*,那么也是1秒以内返回。

6. 结论:es的查询效率也可以很高,只是我们还不会用。

7. 结论2:es有个设置是把所有字段放一块的那个,缺省是放一起,但是不知道为什么没起到应有的作用。

备注:

1. Solr第一次的那个内存使用的是缺省设置,这次改为10G,结果导入性能反而变差了,400万条记录,用了8分钟,平均8333条/秒,不知道为什么。

2. 改回缺省的内存配置,导入速度仍然慢。

3. 重启Linux,用10G的内存配置,再导入,5030万条记录,用时92分,约9112条/秒,说明导入速度和内存配置没有大差别

4. 在10G配置的情况下,检索速度也差别不大。

5. 为了搞清楚lucene4.0和solr4.0的进步有多大,下载了solr3.6.1,所幸的是4.0的配置文件在3.6.1上也可以用,所以很快就搭起来进行测试,导入性能为:3400万条记录,用时55分钟,约10303条/秒,占用空间13.85G。查询性能:*999*第一次11.6s,*00100014* 27.3s,相比4.0ALPHA的结果(5000万结果当中,*999*第一次2.6s,*00100014*第一次2.5s)来说,慢了很多,与es的性能差不多,因此,也许lucene4.0真的对性能有大幅提升?

集群对比:

采用4台同样配置(Intel i7,32G内存)的Centos 6.3组成的集群,进行对比。

1. 首先是es,很方便的就组成了一个Cluster,等上一个3400万条的Index全部均衡负载之后进行测试,导入到另外一个Index当中。

2. 导入性能:8500万条记录,用时72分钟,约为19676条/秒。在前5千万条记录导入时的速度在2万/条以上,初始的速度在2.2万/条。占用空间78.6G(由于有冗余,实际占用空间为157.2G)

3. 查询性能:

*999*第一次13.5秒,第二次19.5秒,第三次7.4秒,第四次7.1秒,第五次7.1秒

*00100014*第一次17.2秒,第二次16.6秒,第三次17.9秒,第四次16.7秒,第五次17.1秒

SAM_CODE:*999*,0.8s,1.3s,0.02s,0.02s,0.02s

SAM_CODE: *00100014*,0.1s,0.1s,0.02s,0.03s,0.05s

4. Solr4.0-ALPHA,SolrCloud的配置还算简单,启动一个ZooKeeper,然后其他三台机器访问这个地址,就可以组成一个Cloud:

机器1: nohup java -Xms10G -Xmx10G -Xss256k -Djetty.port=8983 -Dsolr.solr.home="./example-DIH/solr/" -Dbootstrap_confdir=./example-DIH/solr/db/conf/ -Dcollection.configName=xabconf3 -DzkRun -DnumShards=4 -jar start.jar &

其他机器:nohup java -Xms10G -Xmx10G -Dsolr.solr.home="./example-DIH/solr/" -DzkHost=192.168.2.11:9983 -jar start.jar &

但是在执行 data import 的时候,频繁出现 OutOfMemoryError: unable to create new native thread。查了很多资料,把Linux的ulimit当中的nproc改成10240,把Xss改成256K,都解决不了问题。暂时没有办法进行。

结论

1. 导入性能,es更强

2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升

3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。

相关推荐

Solr备份和恢复

solr目前我们主要使用的是6.x版本,在上面有个类似的backup和restore功能,但是实际测试发现只能对一个core进行操作,而不能对整个collection进行操作,实际中使用solr多采用solrCloud模式,而不是单机或主备模式。 所以在这这种情况下只能采用别的方式进行数据的备份和恢复。 查看solr的帮助文档,发现solr的HTTP接口的API中有删除副本的功能,仔细查看发现删除副本的时候可以保留数据不删除,这不就是我们需要的吗。 所有的副本都下线后,state.json就会变成: 这时候重新建这个索引会报错,已经存在。 通过轮询依次调用各个副本信息后,将整个collection做到完全下线。 但是下线后,这个collection在solr前台仍然存在,还占有一定的资源,最好的办法是删除state.json信息,因为solr还对zookeeper上此节点进行监听的。 上线的时候依次恢复多个副本,当然至于先恢复哪个副本,顺序没有关系, 恢复的语句如下: http://127.0.0.1:8983/solr/test4/replication?command=backup&location=/data/aus/tmpDir&name=test4_20180109140508&wt=json 注意: 1、location: 为备份的数据位置,/data/aus/tmpDir 在23主机上必须存在且有权限。 2、name: 为备份的文件夹后缀名字,按照上面的操作,实际的文件夹为:snapshot. test4_20180109140508 3、备份的目录中的文件夹均是索引数据不含有事务日志。 4、如果不提供name参数则是snapshot.xxxxx xxxx为时间戳信息。 5、numberToKeep即可以保存的最大备份数目,可以提供也可以不提供。 solr自带的api是对整个collection操作,但是却只操作调用的API,不能做分布式操作。 备份步骤: 1)对各个solr节点均需要调用如下操作: http://127.0.0.1:8983/solr/test4/replication?command=backup&location=/data/aus/tmpDir&name=test4_20180109140508&wt=json 注意: 1、location: 为备份的数据位置,/data/aus/tmpDir 在23主机上必须存在且有权限。 2、name: 为备份的文件夹后缀名字,按照上面的操作,实际的文件夹为:snapshot. test4_20180109140508 3、备份的目录中的文件夹均是索引数据不含有事务日志。 4、如果不提供name参数则是snapshot.xxxxx xxxx为时间戳信息。 5、numberToKeep即可以保存的最大备份数目,可以提供也可以不提供。 恢复collection信息调用如下: http://127.0.0.1:8983/solr/test4/replication?command=restore&location=/data/aus/tmpDir&name=test4_20180109140508&wt=json 注意: 1、name不能提供全名和原来的备份的名字一样。 2、如果怕时间长,可以提供异步id,参数为:async = xxxid 然后通过调用查看执行结果: /admin/collections?action=REQUESTSTATUS&requestid=request-id 3、对于replicationFactor 和maxShardsPerNode、autoAddReplicas 还提供重写功能。 方案优缺点: 优点: 整个过程简单,参数少;备份出来是文件夹形式方便压缩或换地方存储。 缺点: 不能备份一个solr节点多个的情况; 由于也有复制,耗时不定,可以采用异步的方式。
2023-08-19 03:27:361

Solr的使用 — 检索

本文是延续 Solr的使用 系列,前一篇文章已经讲了 Solr 的部署和数据推送,这里主要以示例方式讲述 Solr 的常见查询语法,同时介绍如何使用 PHP 语言的客户端 solarium 同 Solr 集群进行数据交互。 想要详细地了解 Solr 查询语法,可参考 官方wiki 。 用于示例的数据,我已经推送到了 Solr , 见这里 。数据 Core 为 rooms,数据格式形如: 通过向 Solr 集群 GET 请求 /solr/core-name/select?query 形式的查询 API 完成查询,其中 core-name 为查询的 Core 名称。查询语句 query 由以下基本元素项组成,按使用频率先后排序: wt 设置结果集格式,支持 json、xml、csv、php、ruby、pthyon,序列化的结果集,常使用 json 格式。 fl 指定返回的字段,多指使用“空格”和“,”号分割,但只支持设置了 stored=true 的字段。 * 表示返回全部字段,一般情况不需要返回文档的全部字段。 字段别名 :使用 displayName:fieldName 形式指定字段的别名,例如: 函数 :fl 还支持使用 Solr 内置函数 ,例如根据单价算总价: fq 过滤查询条件,可充分利用 cache,所以可以利用 fq 提高检索性能。 sort 指定结果集的排序规则,格式为 <fieldName>+<sort> ,支持 asc 和 desc 两种排序规则。例如按照价格倒序排列: 也可以多字段排序,价格和面积排序: 查询字符串 q 由以下元素项组成,字段条件形如 fieldName:value 格式: 以上元素项的默认值由 solrconfig.xml 配置文件定义。通常查询时设置 q=*:* ,然后通过 fq 过滤条件来完成查询,通过缓存提高查询性能。 Solr 的模糊查询使用占位符来描述查询规则,如下: 查询小区名称中包含“嘉”的房源信息: Solr 的模糊查询为: 单精确值查询是最简单的查询,类似于 SQL 中 = 操作符。查询小区 id 为 1111027377528 的房源信息: Solr 中查询为: 多精确值查询是单精确值查询的扩展,格式为 (value1 value2 ...) ,功能类似于 SQL 的 IN 操作符。查询小区 id 为 1111027377528 或者 1111047349969 的房源信息: Solr 中查询为: 范围查询是查询指定范围的值(数字和时间),格式为 [value1 TO value2] ,类似于 SQL 的 BETWEEN 操作符。查询价格在 [2000, 3000] 的房源信息: Solr 中范围查询为: 几个特殊的范围查询: 将基本查询结合布尔查询,就可以实现大部分复杂的检索场景。布尔查询支持以下几种布尔操作: 查询北京市价格区间在 [2000, 3000] 或者上海市价格区间在 [1500, 2000] 的房源信息: 转换为逻辑与布尔查询: 在实际中分组查询比较常见,当然 Solr 也支持分组查询。分组查询语句由以下基本元素项组成(常用部分): 查询西二旗内价格最便宜小区的房源信息: Group 分组查询为: 结果为: 在大多数情况下,Group 分组已经能满足我们的需求,但是如果待分组字段为多值,Group 分组已经无能为力了,这时使用 Facet 就能轻松解决。 Solr 的 Facet 语句由以下基本元素构成(常用): 例如,统计每个商圈的房源分布情况并倒序排列,由于 bizcircleCode 字段为多值,Facet 查询为: 结果如下: Solr 的 geofilt 过滤器可以实现 LBS 检索,但要在 schema.xml 配置中将需检索字段的字段类型设置为 solr.LatLonType 类型。geofilt 过滤器参数列表如下: 示例中的 location 字段,值为 “40.074203,116.315445”,类型配置为: 则检索坐标点 40.074203,116.315445 附近 2 公里的房源信息: Solr 提供一些函数以实现逻辑或数学运算。其中常用 数学运算 函数列表如下: 常用的 逻辑运算 函数: 这些函数可以使用在返回值或者查询条件上。例如返回每个房源的每平方米价格信息: PHP 可以使用 solarium 客户端,实现 Solr 数据源的检索,详细使用说明 见这里 。 solarium 客户端需要配置 Solr 的基本信息。如下: solarium 提供的查询方法较丰富,整理后如下表所示: 查询北京市的所有房源信息,如下: solarium 提供的分组查询方法如下表所示(常用): 获取西二旗每个小区的房源分布信息,如下: solarium 提供的 Facet 查询方法,如下表(常用): 获取北京市每个商圈的房源分布信息,如下: 到这里,Solr 系列就整理完毕了,未涉及的部分后续接触时再补充。这两天利用休息时间充电,自己在 Solr 方面的技能也算是上了一个台阶了。
2023-08-19 03:27:441

Linux里面es和Solr区别是什么?

看这张图就好了
2023-08-19 03:27:523

Solr的提交方式

网上的解释真的不能看,全是错的,因为生产中遇到的一次问题对该原理研究了3天,查看了大量书籍,官方文档终于有了较为深刻的认识 Solr的提交方式只有两种,标准提交(硬提交,hard commit)和软提交(soft commit),说三种的错误 1.默认的提交即硬提交,commit之后会立刻将文档同步到硬盘,在开启新搜索器之前会阻塞,直到同步完成 2.默认情况下commit后会开启一个新搜索器(newSearcher),然后进行预热,预热完成后顶替旧搜索器,使旧缓存失效,但是开启新searcher及预热的过程(IO消耗)耗费资源过大,且可能被阻塞,所以应尽量避免在高峰期开启newsearcher,搜索器同一时间只能有一个处于active状态 3.为了避免频繁commit,solr提供了autocommit功能,可以设置每隔多久提交一次,或者待提交文档量达到阀值提交一次,并且可定义是否在提交后开启新的搜索器,若不开启,则缓存不能够被刷新,新更新文档不能够被实时读取到 1.软提交是将文档提交到内存,并不实时写入硬盘,减少了耗时的I/O操作 2.为了保证实时搜索,solr在软提交基础上引入了近实时搜索(NRT),NRT并不会被文档更新所阻塞,也不会等待文档合并完成再打开一个搜索器(以下摘自官方文档) 3.在lucene4.x 之前,solr采用NRTManager实现NRT,之后使用ControlledRealTimeReopenThread实现,它通过IndexWriter对象来监控内存中的文档变化,从而得到最新的文档信息,该过程既不需要高耗时的I/O操作,也不需要刷新搜索器,所以非常之快,耗费资源很少 4.所以 近实时搜索(NRT)是软提交的一个特性 5.同样的软提交也支持自动提交的方式,配置如下 5.这 两种提交方式并不冲突 ,试想我们程序使用了软提交,但何时可以把数据真正同步到磁盘呢?这时候就可以两者结合达到目的 我们设置每隔5000ms进行一次软提交,文档存入了内存,也可以实时搜索,然后每隔300000ms又会进行进行一次硬提交,同步到磁盘,无需刷新Searcher,如此两者兼顾 6.在配置文件中配置后,在客户端就不需要维护提交方式和提交时间了 1.很多人说由于软提交不及时写入硬盘,所以在jvm崩溃时会丢失部分数据,但其实不会,因为软提交和硬提交在commit时都会记录下操作log,若发生崩溃,会在重启时会从log恢复,这点很像mysql的事务日志操作 2.若maxDocs和maxTime都配置了,则那个条件先到就按那个执行,官方建议使用maxTime,因为solr文档较多,通常更新量也大,使用maxTime可能更能减少提交的频次,但在此建议根据实际情况来决定 3.commit操作后,可执行optimize操作,该操作会合并索引碎片,合并后索引性能会有所提升,但该操作消耗较大,每晚定时操作一次即可
2023-08-19 03:28:211

solr是不是内存查询

是的,相当于非关系型数据库
2023-08-19 03:28:292

solr存在哪些问题

最近搭建一个全文检索平台。最初考虑只采用lucene,然后自己写索引构建程序、检索框架等,类似osc @红薯 的方案,以前也做过比较熟悉。但有两个问题,1.比较复杂,工作量和维护量都比较大。2. 检索会有一定的延时。 看了看Solr决定采用solr,可以节省很大一部分开发时间。但有几个问题想请教下 osc 里的全文检索高手,希望大家不吝赐教: 1.第一种方案,solr配置数据库,自动处理建索引。这样会不会延时很大,无法做到实时检索看 2.第二种方案,通过solrj客户端在应用端 处理建索引问题,比如在发布一篇文章的时候,通过http 提交到solr 服务端上同时建索引,这样能不能达到实时检索看而且同时这个时候 应用端也会通过 http 检索 solr, 建索引检索同时进行,这样访问量大的时候会不会导致 内存泄露、索引文件磁盘I/O负载不了的问题看有经验的同学能不能讨论下?那种方案较好点,对实时性要求高点。或者配置上怎么优化看当然这个项目是企业内部应用,访问量不会太大,服务器资源有限,所以无法用到solr的分布式特性,比如索引复制、多核来解决这些问题。而且由于可能会部署在 windows下,排除了以前做过的sphinx、nlpbamboo 基于Postgresql数据库的方案。
2023-08-19 03:28:431

solr内存调优

在使用使用solr时,当我们的数据量比较大时,我们就要考虑对solr内存进行调优了,不然solr程序就会通过oom脚本将solr实例杀死,导致程序无法正常使用。如果在使用过程中遇到oom,可参考如下解决方案 这样在solr启动时就可以为JVM指定最小(-Xms)和最大(-Xmx)堆大小
2023-08-19 03:28:521

有数据库为什么要solr

严格来说,lucene负责数据存储,而solr只是一个引擎提供搜索和插入而已,跟数据库的解释器一样,有什么好处呢,比如一个数据库有一个字段存了1000个字,你想从这些字里面搜一个词的时候,普通的数据库只会让你使用like去查询,他会遍历每个字去模糊匹配,效率很低,而且有些是无法查询的,当然除了像一些特殊的数据库带有分词,比如postgresql,那lucene做的事情就是分词,然后去匹配分词的词中是否有你想搜的词就好了,当然了,为了提高这种检索效率和内存节省底层做了很复杂的事情,可以这么简单的认为,全文搜索这件事情上数据库是无法满足的
2023-08-19 03:29:211

solr查询条件多响应时间

150ms。根据《solr查询条件多响应时间条例》可知,该查询软件的搜索的响应时间是150ms,该搜索软件的配置基本是内存在4-8G,cpu:2-8core的服务器,索引的大小为8G,搜索的信息十分全面,受到广泛的好评。
2023-08-19 03:29:451

solr的数据怎么来的?

solr是一个全文检索数据库对外提供了数据读取和写入的接口数据当然主要是从接口来 主要是http通信,你要按solr文档数据提交格式来写入数据细节要查文档了
2023-08-19 03:29:531

什么是mongodb,zookeeper,redis,solr

MongoDB[1] 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
2023-08-19 03:30:011

solr 增量索引 怎么没执行

一、增量索引之删除  昨天已经说过,增量索引其实就是SOLR对上次做过(增量或者全量)索引之后到这次做索引之间的这段时间数据库发生变化的数据进行创建索引,昨天我们说了增加一条数据或者修改一条数据之后创建增量索引,现在来说删除数据的增量索引。  其实这里所说的删除是假删除,什么意思呢?就是并不是说在数据库中把某些数据给彻底删除掉,而是说给你不想创建索引的数据一个标识符,然后告诉solr,有这个标识符的数据你就不要给我创建索引了,我不需要,然后solr创建索引的时候就会忽视这些有特殊标识符的数据,大概的原理就是这样的,那么怎么实现的呢?下面来看:  1.1数据库新增字段  昨天做新增的增量索引的时候需要在数据库添加一个字段,今天做删除的,还是需要一个字段,然后用这个字段来标示数据是否需要创建索引,字段如下所示:    字段名称大家可以自己看着定,类型给个int就行,至于长度也随意,我的是0表示需要创建索引的数据,1表示不需要创建索引的数据,也就是我所说的假删除的数据。  1.2修改配置文件  同样,需要将该字段配置到data-config.xml和schema.xml文件中,如下所示:  data-config.xml    注意圈起来的三个地方,首先肯定是需要把isdelete字段变成一个file标签,其次,需要query语句需要添加上where条件,查询出数据库中所有的需要创建索引的数据,然后再添加一个deletedPKQuery语句,这条语句和deltaQuery与deltaImportQuery语句一样,都是只有在做增量索引的时候起作用,deletedPKQuery是查询出所有假删除的数据的ID,然后由deltaImportQuery查询出这些ID对应的记录的全部数据,然后在已经创建的索引中删除掉这一部分索引。  schema.xml  schema.xml文件中倒是没有什么大的变化,只需要把isdelete字段添加进来即可:  1.3查看效果按照上面的配置即可,然后我们来看一下效果,首先是数据库:还是昨天的17条数据。SOLR已经创建好的索引:索引也是17条,和数据库的数据是对应的,下面我把数据库中的其中两条数据的isdelet字段修改成1,然后创建一个增量索引,方法和昨天一样,我就不再截图了,首先还是修改数据库:把发哥跟梁朝伟的isdelete修改成1,执行增量索引后的结果如下:可以看到此时的索引少了2条,那到底少的是不是我变成1的两个人呢?我们可以查找一下,找不到的话就对了:可以看到此时查找周润发,但是只找到了星爷,这个原因还是分词器的问题,昨天已经说过了,下面再查一下梁朝伟:可以看到查找结果是空的。  通过上面的两条查询,说明我们对假删除所做的增量索引时成功的。二、定时增量索引  如果每次数据库变化两条数据我们就得到http://localhost:8080/solr这里做一次增量索引,那不是很麻烦吗?所以SOLR提供了定时任务的功能,当然你也可以自己集成,比如用sPRing的定时任务,或者集成Quartz这些,定时执行一下增量索引的URL,也是可以达到相同的目的的,但是我们今天说的并不是这个,下面开始详细说。  首先,需要引入一个JAR包,这个JAR包我已经发在了第一篇文章最后的DEMO里面了,解压之后就可以看到,但是我要说一点的是,我发出的JAR包是修改过源码的JAR包,很多地方给出的JAR包是apache-solr-dataimportscheduler-1.0.jar这个JAR包,下载地址是http://code.google.com/p/solr-dataimport-scheduler/downloads/list,但是这个jar包放入tomcat下的solr项目的lib包后会出错,其实也不是出错,而是出现下面的问题:http请求一直返回415,提示不支持的媒体类型,这个问题上周六折腾了我一天的时间,快被郁闷死了,后来在网上查资料的时候看到了别人的一篇文章,也才得以解决,一会儿我会把那个文章地址也发出来,这是什么原因呢?原因就是这个jar包中的一个类在发送http请求时使用的是post方式,但是我们这里发送的请求却是get方式,所以才一直415,很蛋疼有没有,所以需要进入jar包,修改源码之后才能正常工作,我看的那篇文章地址是:http://blog.csdn.net/zwx19921215/article/details/43152307,里面讲的很详细,还有另外的一个问题,大家可以看一下,好了,把这个jar包引入solr的lib包之后进行下一步。  第二步就是在solr的web.xml文件中添加如下代码:    第三步,解压apache-solr-dataimportscheduler-1.0.jar文件,从解压出来的文件夹中找出dataimport.properties文件,然后复制该文件到你的SOLR_HOME目录下的conf文件夹中,注意,这个conf文件夹并不是SOLR_HOMEcollection1下的conf,而是SOLR_HOMEconf文件夹,以前是不存在的,需要你自己创建。 、  第四步,打开dataimport.properties文件,修改该文件内容,修改后的文件内容如下所示:  ################################################## ## dataimport scheduler properties ## ################################################### to sync or not to sync# 1 - active; anything else - inactivesyncEnabled=1# which cores to schedule# in a multi-core environment you can decide which cores you want syncronized# leave empty or comment it out if using single-core deploymentsyncCores=collection1# solr server name or ip address# [defaults to localhost if empty]server=localhost# solr server port# [defaults to 80 if empty]port=8080# application name/context# [defaults to current ServletContextListener"s context (app) name]webapp=solr# URL params [mandatory]# remainder of URLparams=/dataimport?command=delta-import&clean=false&commit=true&wt=json&optimize=false # schedule interval# number of minutes between two runs# [defaults to 30 if empty]interval=1# 重做索引的时间间隔,单位分钟,默认7200,即1天; # 为空,为0,或者注释掉:表示永不重做索引reBuildIndexInterval=7200# 重做索引的参数reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期reBuildIndexBeginTime=03:10:00  注意:    1.syncCores=collection1表示对collection1这个core定时创建索引,如果不设置的话,默认也是对collection1创建索引,如果用到了multicore,那么使用逗号隔开即可。    2.server=localhost,port=8080改成你自己的容器地址和端口号即可;    3.interval=1表示定时增量索引的时间间隔,单位是分钟;    4.其他的按照上面的注释配置即可,也没什么难理解的;
2023-08-19 03:30:091

Solr 配置DataImport出错的问题

solr.xml 发来看下在dataimport的时候指向的core1名字不正确
2023-08-19 03:30:331

如何查处solr中所有的core

1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war。2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties文件复制到tomcat_dir/lib目录下;切把 solr-4.7.1/example/solr,复制到tomcat_dir/bin下。3、修改tomcat_dir/conf/server.xml<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" />4、创建solr.xml,存放在路径:tomcat/conf/Catalina/localhost/solr.xml,内容:<Context path="/solr" docBase="C:Tomcat 7.0webappssolr.war"debug="0" crossContext="true"><Environment name="solr/home" type="java.lang.String" value="C:Tomcat 7.0insolr" override="true" /></Context>PS:上面的docBase和value路径中不能存在中文字符,否则会出现404错误。5、将C:Tomcat 7.0webapps下的solr.war包,启动项目解压;然后再添加几个jar包:solr-4.7.1distsolr-dataimporthandler-4.7.1.jar;solr-4.7.1distsolr-dataimporthandler-extras-4.7.1.jar;还要加载数据库驱动包:mysql-connector-java-3.1.13-bin.jar6、在C:Tomcat 7.0insolrcollection1conf 下的solrconfig.xml增加以下数据库配置:<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>7、将tomcatinsolrcollection1conf下增加data-config.xml文件,内容如下:<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.221:3306/tmsdb" user="root" password="123456"/> <document name="content"> <entity name="node" query="select id,author,title,content from solrdb"> <field column="id" name="id" /> <field column="author" name="author" /> <field column="title" name="title" /> <field column="content" name="content" /></entity> </document> </dataConfig>8、增加中文分词器,ik-analyzer的配置如下:①目前的中文分词主要有两种 1,基于中科院ICTCLAS的隐式马尔科夫hhmm算法的中文分词器,例如smartcn等。(不支持自定义扩展词库) 2,基于正向迭代最细粒度切分算法(正向最大匹配并且最细分词)例如IK,庖丁等(支持自定义扩展词库) 安装分词前,可以去下载IK的分词包 :IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar下载完毕后,将此包放进tomcatsolr的WEB-INFlib下面:tomcatwebappssolrWEB-INFlib 。下面需要在solr的schemal.xml进行分词器注册:<!-- 配置IK分词器 --> <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/> --> </analyzer> <analyzer type="query"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>--> </analyzer> </fieldType>最后还得配置一个引用字段就OK了<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>②它的安装部署十分简单,将IKAnalyzer2012.jar部署亍项目的lib目录中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目录(对于web项目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然后配置solr4.7中schema.xml配置解析器:<schema name="example" version="1.1"> …… <fieldType name="text" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>…… </schema>
2023-08-19 03:31:521

solr对java程序员重要吗

  还是重要的。  Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
2023-08-19 03:32:001

solr如何让全词匹配结果在最前面

先,只要在搜索的时候增加title字段的权重即可,如果改动较小的情况下,updatetime靠前,标题匹配靠前,这个比较容易sort=updatetime desc 其次,如果想绝对的靠前
2023-08-19 03:32:071

如何理解solr的core和collection

 collection英 [ku0259u02c8leku0283n] 美 [ku0259u02c8lu025bku0283u0259n]  n.征收; 收集,采集; 收藏品; 募捐;  [例句]Computer systems to speed up collection of information  加速信息收集的计算机系统  [其他]复数:collections 形近词: bilection election selection  --  core英 [ku0254:(r)] 美 [ku0254r, kor]  n.中心,核心,精髓; 果心,果核; [地质学] 地核; [计] 磁心;  vt.去(果)核,挖去…的果心; 提取岩芯; (样品)  [例句]Temperatures in this range, it seems, help facilitate the decrease in core body temperature that in turn initiates sleepiness.  温度处于这个范围内,似乎利于中心体温的降低,而中心体温降低反过来利于睡眠。  [其他]第三人称单数:cores 复数:cores 现在分词:coring 过去式:cored 过去分词:cored
2023-08-19 03:32:151

solr有多个查询字段时查询语句的格式

solr query和filter执行顺序: 1,fq首先在cache中查找,如果命中,则返回DocSet 2,如果没有命中,则在索引中查找,返回DocSet并cache 3,1,2步的DocSet合并为一个DocSet 4,q的查询结果也被传递过来,选取两个结果集的相同Document ID
2023-08-19 03:32:221

如何使用Solr索引MySql数据库

在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例。首先要准备jar包:solr-dataimporthandler-4.8.1.jar、solr-dataimporthandler-extras-4.8.1.jar和mysql-connector-java-5.0.7-bin.jar这三个包到solr的tomcat的webappssolrWEB-INFlib下在这个文件夹的conf下配置两个文件,添加一个文件。先配置solrconfig.xml。在该文件下添加一个新节点。<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"><lst name="defaults"><str name="config">data-config.xml</str></lst></requestHandler>在solrconfig.xml的同目录下创建data-config.xml。配置:复制代码<dataConfig><dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/courseman"user="root"password="mysql" /><document><entity name="student"query="SELECT * FROM student"><field column="id" name="id" /><field column="name" name="name" /><field column="gender" name="gender" /><field column="major" name="major" /><field column="grade" name="grade" /></entity></document></dataConfig>复制代码schemal.xml的配置复制代码<?xml version="1.0" ?><!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License atUnless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><schema name="example core one" version="1.1"><fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/><fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/><fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/><!-- general --><field name="id" type="int" indexed="true" stored="true" /><field name="gender" type="string" indexed="true" stored="true" /><field name="name" type="string" indexed="true" stored="true" /><field name="major" type="string" indexed="true" stored="true" /><field name="grade" type="string" indexed="true" stored="true" /><field name="_version_" type="long" indexed="true" stored="true"/><!-- field to use to determine and enforce document uniqueness. --><uniqueKey>id</uniqueKey><!-- field for the QueryParser to use when an explicit fieldname is absent --><defaultSearchField>name</defaultSearchField><!-- SolrQueryParser configuration: defaultOperator="AND|OR" --><solrQueryParser defaultOperator="OR"/></schema>复制代码默认的文件不是这样的,稍微改动了一下。field 的type类型是根据fieldtype 的name定义的。class是solr自定义的不能更改。shcema.xml文件的field字段的属性介绍:(1)name:字段名称(2)type:字段类型(此处type不是java类型,而是下面定义的fieldType)(3)indexed:是否索引看true--solr会对这个字段进行索引,只有经过索引的字段才能被搜索、排序等;false--不索引(4)stored:是否存储看true--存储,当我们需要在页面显示此字段时,应设为true,否则false。(5)required:是否必须看true--此字段为必需,如果此字段的内容为空,会报异常;false--不是必需(6)multiValued:此字段是否可以保存多个值看(7)omitNorms:是否对此字段进行解析看有时候我们想通过某个字段的完全匹配来查询信息,那么设置 indexed="true"、omitNorms="true"。(8)default:设置默认值有这样一个FieldType描述:<fieldType name="text_general" positionIncrementGap="100"><analyzer type="index"><tokenizer/><filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><filter/></analyzer><analyzer type="query"><tokenizer/><filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><filter synonyms="synonyms.txt" ignoreCase="true" expand="true"/><filter/></analyzer></fieldType>属性说明:(1)name:类型名称,<field>中的type引用的就是这个name(2)class:solr自定义的类型(3)<analyzer type="index">定义建立索引时使用的分词器及过滤器(4)<analyzer type="query">定义搜索时所使用的分词器及过滤器(5)<tokenizer/>定义分词器(6)<filter/>定义过滤器uniqueKey属性<uniqueKey>id</uniqueKey>类似于数据表数据的id,solr索引库中最好定义一个用于标示document唯一性的字段,此字段主要用于删除document。defaultSearchField属性就是你在做query搜寻时若不指定特定栏位做检索时, Solr就会只查这个栏位.<defaultSearchField>default</defaultSearchField>copyField属性是用来复制你一个栏位里的值到另一栏位用. 如你可以将name里的东西copy到major里, 这样solr做检索时也会检索到name里的东西.<copyField source="name" dest="major"/>现在可以将数据库的数据导入solr了。点击Execute就可以了。
2023-08-19 03:32:301

如何对solr中数据进行查询统计并得到全部查

条件组合查询SQL查询语句:SELECT log_id,start_time,end_time,prov_id,city_id,area_id,idt_id,cnt,net_typeFROM v_i_eventWHERE prov_id = 1 AND net_type = 1 AND area_id = 10304 AND time_type = 1 AND time_id >= 20130801 AND time_id <= 20130815ORDER BY log_id LIMIT 10;
2023-08-19 03:32:371

solr oom会导致io变高吗

会。在使用使用solr时,当我们的数据量比较大时,我们就要考虑对solr内存进行调优了,不然solr程序就会通过oom脚本将solr实例杀死,导致程序无法正常使用。
2023-08-19 03:32:451

求助:solr如何通过指定条件修改数据

修改主方法public int saveContent(String enterpriseId, String enterpriseName, String lableType, String resouce, String pubDate,String content) {int state = 0;LBHttpSolrServer server = SolrUtil.getSolrServer(ap.getEnterprisenewSolrUrl());SolrQuery query = new SolrQuery();query.set("q", "enterpriseId:" + enterpriseId);try {QueryResponse qr = server.query(query);List<EnterpriseContentBean> contentList = qr.getBeans(EnterpriseContentBean.class);// 设置需要保存的文章信息for (EnterpriseContentBean bean : contentList) {bean.setEnterpriseId(enterpriseId);bean.setEnterpriseName(enterpriseName);List<String> contents = new ArrayList<String>();contents.add(content);bean.setContent(contents);bean.setPubDate(pubDate);System.out.println("pubDate======>" + pubDate);List<String> lableTypes = Arrays.asList(lableType.split(","));bean.setLableType(lableTypes);bean.setResource(resouce);bean.setIsVisited_s("1");}server.addBeans(contentList);server.commit();} catch (SolrServerException e) {state = 1;System.out.println("修改solr数据报错");e.printStackTrace();} catch (IOException e) {state = 1;System.out.println("修改solr数据报错");e.printStackTrace();}return state;}删除主方法public int deletContent(String enterpriseId) {LBHttpSolrServer server = SolrUtil.getSolrServer(ap.getEnterprisenewSolrUrl());int state = 0;try {server.deleteById(enterpriseId);server.commit();} catch (SolrServerException e) {state = 1;System.out.println("删除solr数据报错");e.printStackTrace();} catch (IOException e) {state = 1;System.out.println("删除solr数据报错");e.printStackTrace();}return state;}solr工具类 package com.dinfo.boc.utils;import java.io.IOException;import java.net.MalformedURLException;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.List;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.LBHttpSolrServer;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;import com.dinfo.boc.enterprise.bean.EnterpriseContentBean;import com.dinfo.boc.enterprisenew.bean.SolrQueryResult;/*** 与Solr服务器交互的工具类* @author qiuyj**/public class SolrUtil {/*** 获取与指定Solr地址的连接* @param solrUrl* @return*/public static LBHttpSolrServer getSolrServer(String solrUrl){final int ONE_HUNDRED_MS = 10000000;if(solrUrl == null || "".equals(solrUrl)){throw new RuntimeException("Solr url can not be empty!");}LBHttpSolrServer solrServer = null;try {solrServer = new LBHttpSolrServer(solrUrl);solrServer.setConnectionTimeout(ONE_HUNDRED_MS);} catch (MalformedURLException e) {e.printStackTrace();} //SolrUtil.getSolrServer(solrUrl);//solrServer.setDefaultMaxConnectionsPerHost(100);//solrServer.setMaxTotalConnections(100);return solrServer;}/*** 向指定的Solr地址添加一条数据* @param solrUrl* @param doc* @throws Exception*/public static void add(String solrUrl, SolrInputDocument doc) throws Exception {if(doc == null){throw new RuntimeException("SolrInputDocument object can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.add(doc);solr.commit();}/*** 向指定的Solr地址用JavaBean添加一条数据* @param solrUrl* @param obj* @throws Exception*/public static void add(String solrUrl, Object obj) throws Exception {if(obj == null){throw new RuntimeException("Object to be inserted can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.addBean(obj);solr.commit();}/*** 向指定Solr地址批量添加数据* @param solrUrl* @param docs* @throws Exception*/@SuppressWarnings("unchecked")public static void addAll(String solrUrl, Collection<? extends Object> objs) throws Exception {if(objs == null){throw new RuntimeException("Object collection can not be null!");}if(objs.size() == 0){return;}LBHttpSolrServer solr = getSolrServer(solrUrl);if(objs.iterator().next() instanceof SolrInputDocument){solr.add((Collection<SolrInputDocument>)objs);} else {solr.addBeans(objs);}solr.commit();}/*** 根据给定的id,从solr中删除对应信息* @param solrUrl* @param ids*/public static void deleteByIds(String solrUrl, String ... ids) throws Exception {if(ids == null || ids.length == 0){throw new RuntimeException("Ids can not be empty!");}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.deleteById(Arrays.asList(ids));solr.commit();}public static void deleteByIds(String solrUrl, Integer ... ids) throws Exception {if(ids == null || ids.length == 0){throw new RuntimeException("Ids can not be empty!");}List<String> stringIdList = new ArrayList<>(ids.length);for(Integer id : ids){stringIdList.add("" + id);}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.deleteById(stringIdList);solr.commit();}/*** 删除指定Solr路径下符合指定查询条件的数据* @param solrUrl* @param condition* @throws Exception*/public static void deleteByCondition(String solrUrl, String condition) throws Exception {if(condition == null || "".equals(condition)){throw new RuntimeException("Condition can not be empty!");}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.deleteByQuery(condition);solr.commit();}/*** 删除指定Solr路径下的所有数据* @param solrUrl* @throws Exception*/public static void deleteAll(String solrUrl) throws Exception {deleteByCondition(solrUrl, "*:*");}/*** 根据 指定查询条件从Solr中查询数据,并以SolrDocument的List形式返回* @param solrUrl* @param query* @return* @throws Exception*/public static SolrDocumentList queryAndGetSolrDocumentList(String solrUrl, SolrQuery query) throws Exception {if(query == null){throw new RuntimeException("SolrQuery object can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);QueryResponse resp = solr.query(query);return resp.getResults();}/*** 根据 指定查询条件从Solr中查询数据,并以QueryResponse形式返回* @param solrUrl* @param query* @return* @throws Exception*/public static QueryResponse queryAndGetSolrQueryResponse(String solrUrl, SolrQuery query) throws Exception {if(query == null){throw new RuntimeException("SolrQuery object can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);QueryResponse resp = solr.query(query);return resp;}/*** 根据 指定查询条件从Solr中查询数据,并以Java Bean的List形式返回* @param solrUrl* @param query* @param returnClass 返回的List集合的泛型* @return* @throws Exception*/public static <T> List<T> queryAndGetBeanList(String solrUrl, SolrQuery query, Class<T> returnClass) throws Exception {if(query == null){throw new RuntimeException("SolrQuery object can not be null!");}if(returnClass == null){throw new RuntimeException("Return class can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);QueryResponse resp = solr.query(query);return resp.getBeans(returnClass);}/*** 根据 指定查询条件从Solr中查询数据,并以SolrQueryResult对象的形式返回,其中包含List对象和totalCount* @param solrUrl* @param query* @param returnClass 返回的List集合的泛型* @return* @throws Exception*/public static <T> SolrQueryResult<T> queryAndGetSolrQueryResult(String solrUrl, SolrQuery query, Class<T> returnClass) throws Exception {SolrQueryResult<T> result = new SolrQueryResult<T>();if(query == null){throw new RuntimeException("SolrQuery object can not be null!");}if(returnClass == null){throw new RuntimeException("Return class can not be null!");}LBHttpSolrServer solr = getSolrServer(solrUrl);solr.setConnectionTimeout(10000);QueryResponse resp = solr.query(query);List<T> resultList = resp.getBeans(returnClass);long totalCount = resp.getResults().getNumFound();result.setResultList(resultList);result.setTotalCount(totalCount);return result;}/*** 根据 指定查询条件从Solr中查询数据,并以SolrQueryResult对象的形式返回,其中包含List对象和totalCount* @param solrUrl* @param query* @param returnClass 返回的List集合的泛型* @return* @throws Exception*/public static <T> SolrQueryResult<T> queryAndGetSolrQueryResult(LBHttpSolrServer solr, SolrQuery query, Class<T> returnClass) throws Exception {SolrQueryResult<T> result = new SolrQueryResult<T>();if(query == null){throw new RuntimeException("SolrQuery object can not be null!");}if(returnClass == null){throw new RuntimeException("Return class can not be null!");}QueryResponse resp = solr.query(query);List<T> resultList = resp.getBeans(returnClass);long totalCount = resp.getResults().getNumFound();result.setResultList(resultList);result.setTotalCount(totalCount);return result;}/*** 用以过滤一些影响Solr查询的特殊字符,如左右括号、星号等* @param str* @return*/public static String filterSpecialCharacters(String str){if(str == null){return str;}str = str.replace("(", "\(");str = str.replace(")", "\)");str = str.replace("*", "\*");return str;}public static void updateSolrById(LBHttpSolrServer server){SolrQuery query = new SolrQuery();String id="5d495a00a5c8118c03ef0bec0111dd8d";int state=0;String name="新疆金风科技股份有限公司";query.set("q", "enterpriseId:"+id);try {QueryResponse qr = server.query(query);List<EnterpriseContentBean> contentList = qr.getBeans(EnterpriseContentBean.class);//设置需要保存的文章信息for(EnterpriseContentBean bean:contentList){// bean.setEnterpriseId(enterpriseId);bean.setEnterpriseName(name);bean.setResource("东方财富网港股频道");}server.addBeans(contentList);server.commit();} catch (SolrServerException e) {state = 1;e.printStackTrace();} catch (IOException e) {state = 1;e.printStackTrace();}}public static void main(String[] args) {try {LBHttpSolrServerenterpriseServer=new LBHttpSolrServer("http://115.182.226.165:8008/solr/enterprisenew");enterpriseServer.setConnectionTimeout(10000000);updateSolrById(enterpriseServer);System.out.println("over");} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
2023-08-19 03:32:531

如何在solr配置文件里添加新的搜索字段

solr的三个配置文件:1、solrconfig.xml 只配置一次就够了2、data-config.xml 配置数据库与solr搜索的映射关系,需要按实际情况处理3、schema.xml 配置solr搜索字段
2023-08-19 03:33:001

solr应用一般怎么打包部署

解压 Tomcat 到一个目录,例如 F:ApacheTomcat将 solr 压缩包中 solr-5.3.0/ D:solr-5.3.0serversolr-webapp文件夹下有个webapp文件夹,将之复制到Tomcatwebapps目录下,并改成solr (名字随意,通过浏览器进行访问solr管理界面时要用到)将 solr 压缩包中 solr-5.3.0serverlibext 中的 jar 全部复制到 Tomcat webappssolrWEB-INFlib 目录中将 solr 压缩包中 solr-5.3.0/ server/resources /log4j.properties 复制到Tomcat webappssolrWEB-INFlib 目录中将 solr 压缩包中 solr-5.3.0/server/solr 目录复制到计算机某个目录下,如D:solr_home打开Tomcat/webapps/solr/WEB-INF下的web.xml,找到如下配置内容(初始状态下该内容是被注释掉的):<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>/put/your/solr/home/here</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>将<env-entry-value>中的内容改成你的solr_home路径,这里是D:/solr_home7保存关闭,而后启动tomcat,在浏览器输入http://localhost:8080/solr即可出现Solr的管理界面
2023-08-19 03:33:201

solr jvm配置多大比较好

0×00 开头照例扯淡自从各种脱裤门事件开始层出不穷,在下就学乖了,各个地方的密码全都改成不一样的,重要帐号的密码定期更换,生怕被人社出祖宗十八代的我,甚至开始用起了假名字,我给自己起一新网名”兴才”,这个看起来还不错的名字,其实是我们家乡骂人土话,意思是脑残人士…. -_-|||额好吧,反正是假的,不要在意这些细节。这只是名,至于姓氏么,每个帐号的注册资料那里,照着百家姓上赵钱孙李周吴郑王的依次往下排,什么张兴才、李兴才、王兴才……于是也不知道我这样”兴才”了多久,终于有一天,我接到一个陌生电话:您好,请问是马兴才先生吗?好么,该来的终于还是来了,于是按名索骥,得知某某网站我用了这个名字,然后通过各种途径找,果然,那破站被脱裤子了。果断Down了那个裤子,然后就一发不可收拾,走上了收藏裤子的不归路,直到有一天,我发现收藏已经非常丰富了,粗略估计得好几十亿条数据,拍脑袋一想,这不能光收藏啊,我也搭个社工库用吧……0×01 介绍社工库怎么搭呢,这种海量数据的东西,并不是简单的用mysql建个库,然后做个php查询select * from sgk where username like ‘%xxxxx%"这样就能完事的,也不是某些幼稚骚年想的随便找个4g内存,amd双核的破电脑就可以带起来的,上面这样的语句和系统配置,真要用于社工库查询,查一条记录恐怕得半小时。好在这个问题早就被一种叫做全文搜索引擎的东西解决了,更好的消息是,全文搜索引擎大部分都是开源的,不需要花钱。目前网上已经搭建好的社工库,大部分是mysql+coreseek+php架构,coreseek基于sphinx,是一款优秀的全文搜索引擎,但缺点是比较轻量级,一旦数据量过数亿,就会有些力不从心,并且搭建集群做分布式性能并不理想,如果要考虑以后数据量越来越大的情况,还是得用其他方案,为此我使用了solr。Solr的基础是著名的Lucene框架,基于java,通过jdbc接口可以导入各种数据库和各种格式的数据,非常适合开发企业级的海量数据搜索平台,并且提供完善的solr cloud集群功能,更重要的是,solr的数据查询完全基于http,可以通过简单的post参数,返回json,xml,php,python,ruby,csv等多种格式。以前的solr,本质上是一组servlet,必须放进Tomcat才能运行,从solr5开始,它已经自带了jetty,配置的好,完全可以独立使用,并且应付大量并发请求,具体的架构我们后面会讲到,现在先来进行solr的安装配置。0×02 安装和配置以下是我整个搭建和测试过程所用的硬件和软件平台,本文所有内容均在此平台上完成:软件配置: solr5.5,mysql5.7,jdk8,Tomcat8 Windows10/Ubuntu14.04 LTS硬件配置: i7 4770k,16G DDR3,2T西数黑盘2.1 mysql数据库Mysql数据库的安装和配置我这里不再赘述,只提一点,对于社工库这种查询任务远远多于插入和更新的应用来说,最好还是使用MyISAM引擎。搭建好数据库后,新建一个库,名为newsgk,然后创建一个表命名为b41sgk,结构如下:id bigint 主键 自动增长username varchar 用户名email varchar 邮箱password varchar 密码salt varchar 密码中的盐或者第二密码ip varchar ip、住址、电话等其他资料site varchar 数据库的来源站点接下来就是把收集的各种裤子全部导入这个表了,这里推荐使用navicat,它可以支持各种格式的导入,具体过程相当的枯燥乏味,需要很多的耐心,这里就不再废话了,列位看官自己去搞就是了,目前我初步导入的数据量大约是10亿条。2.2 Solr的搭建和配置首先下载solr:$ wget 解压缩:$ tar zxvf solr-5.5.0.tgz安装jdk8:$ sudo add-apt-repository ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get install oracle-java8-installer$ sudo apt-get install oracle-java8-set-default因为是java跨平台的,Windows下和linux下solr是同一个压缩包,windows下jdk的安装这里不再说明。进入解压缩后的solr文件夹的bin目录,solr.cmd和solr分别是windows和linux下的启动脚本:因为社工库是海量大数据,而jvm默认只使用512m的内存,这远远不够,所以我们需要修改,打开solr.in.sh文件,找到这一行:SOLR_HEAP=”512m”依据你的数据量,把它修改成更高,我这里改成4G,改完保存. 在windows下略有不同,需要修改solr.in.cmd文件中的这一行:set SOLR_JAVA_MEM=-Xms512m -Xmx512m同样把两个512m都修改成4G。Solr的启动,重启和停止命令分别是:$ ./solr start$ ./solr restart –p 8983$ ./solr stop –all在linux下还可以通过install_solr_service.sh脚本把solr安装为服务,开机后台自动运行。Solr安装完成,现在我们需要从mysql导入数据,导入前,我们需要先创建一个core,core是solr的特有概念,每个core是一个查询、数据,、索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新core:在solr-5.5.0/server/solr子目录下面建立一个新文件夹,命名为solr_mysql,这个是core的名称,在下面创建两个子目录conf和data,把solr-5.5.0/solr-5.5.0/example/example-DIH/solr/db/conf下面的所有文件全部拷贝到我们创建的conf目录中.接下来的配置主要涉及到三个文件, solrconfig.xml, schema.xml和db-data-config.xml。首先打开db-data-config.xml,修改为以下内容:这个文件是负责配置导入数据源的,请按照mysql实际的设置修改datasource的内容,下面entity的内容必须严格按照mysql中社工库表的结构填写,列名要和数据库中的完全一样。然后打开solrconfig.xml,先找到这一段:truemanaged-schema把它全部注释掉,加上一行,改成这样:<!-- truemanaged-schema-->这是因为solr5 以上默认使用managed-schema管理schema,需要更改为可以手动修改。然后我们还需要关闭suggest,它提供搜索智能提示,在社工库中我们用不到这样的功能,重要的是,suggest会严重的拖慢solr的启动速度,在十几亿数据的情况下,开启suggest可能会导致solr启动加载core长达几个小时!同样在solrconfig.xml中,找到这一段:mySuggesterFuzzyLookupFactory DocumentDictionaryFactory catpricestringtrue10suggest把这些全部删除,然后保存solrconfig.xml文件。接下来把managed-schema拷贝一份,重命名为schema.xml (原文件不要删除),打开并找到以下位置:只保留_version_和_root_节点,然后把所有的field,dynamicField和copyField全部删除,添加以下的部分:id这里的uniqueKey是配置文件中原有的,用来指定索引字段,必须保留。新建了一个字段名为keyword,它的用途是联合查询,即当需要同时以多个字段做关键字查询时,可以用这一个字段名代替,增加查询效率,下面的copyField即用来指定复制哪些字段到keyword。注意keyword这样的字段,后面的multiValued属性必须为true。username和email以及keyword这三个字段,用来检索查询关键字,它们的类型我们指定为text_ik,这是一个我们创造的类型,因为solr虽然内置中文分词,但效果并不好,我们需要添加IKAnalyzer中文分词引擎来查询中文。在下载IKAnalyzer for solr5的源码包,然后使用Maven编译,得到一个文件IKAnalyzer-5.0.jar,把它放入solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后在solrconfig.xml的fieldType部分加入以下内容:保存后,core的配置就算完成了,不过要导入mysql数据,我们还需要在mysql网站上下载mysql-connector-java-bin.jar库文件,连同solr-5.5.0/dist目录下面的solr-dataimporthandler-5.5.0.jar,solr-dataimporthandler-extras-5.5.0.jar两个文件,全部拷贝到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后重启solr,就可以开始数据导入工作了。
2023-08-19 03:33:281

如何合理的控制solr查询的命中的数量

必须命中3个或更多的term,我才认为相关性更大,或者有一个百分比来限制80%以上的命中,就算此条记录不错。这个使用solr的edismax可以解决,方法如下:使用edismax,在q里写完 name:xxxxx饭 在Raw Query Paramters参数里面写 defType=edismax&mm=80%25然后查询即可,mm是最小匹配的数量,可以是个固定的值,也可也是个百分比,因为散仙是在solr的admin页面查询,所以需要把%替换成url字符%25,这样才能正确发送到solr的服务端 具体的资料请看:
2023-08-19 03:33:361

solr怎样部署到weblogic

Solr需要运行在一个servlet 容器里(因此目前几乎所有常见的Servlet容器都可以满足Solr的运行需要)。solr在lucene的上层提供了一个基于HTTP/XML的Web Services,应用需要通过这个服务与solr进行交互。 关于Solr的详细介绍,此处就不再赘述
2023-08-19 03:33:431

solr在maven项目中都需要什么依赖

第一步:编写maven项目的pom文件,导入依赖[html] view plain copy<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.millery.spring_solr</groupId> <artifactId>spring-solr</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!-- 添加依赖 --> <dependencies> <!-- Spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.1.3.RELEASE</version> </dependency>
2023-08-19 03:33:521

Solr可以不用Tomcat部署吗

可以啊, solr是基于servlet实现的,因此所有的servlet容器都可以。 比如:jetty
2023-08-19 03:34:001

数据库定义的字段过大怎么解析 solr

关系型数据库有四个显著的特征,即安全性、完整性、并发性和监测性。数据库的安全性就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全。在大多数数据库管理系统中,主要是通过许可来保证数据库的安全性
2023-08-19 03:34:071

solr 怎么根据条件查询总数量

public class ProductSearchService { //通过spring注入HttpSolrServer对象 @Autowired private HttpSolrServer httpSolrServer; /** * * @描述:根据商品类型、商品颜色、价格区间组合条件到solr中查询数据 * @创建人: * @创建时间:2015年11月04日 上午10:49:19 * @param productType 商品的类型 * @param minPrice 价格区间底价 * @param maxPrice 价格区间顶价 * @param color 商品的颜色 * @return 查询得到的所有商品列表 * @throws SolrServerException */ public List<Product> queryProduct(String productType,String color, Float minPrice, Float maxPrice) throws SolrServerException { // 创建查询对象 SolrQuery solrQuery = new SolrQuery(); // 创建组合条件串 StringBuilder params = new StringBuilder("productType:" + productType); // 组合商品颜色条件 if (color != null) { params.append(" AND color:" + color); } // 组合价格区间条件 if (minPrice.intValue() != 0 || maxPrice != 0) { params.append(" AND spPrice:[" + minPrice + " TO " + maxPrice + "]"); } solrQuery.setQuery(params.toString()); // 执行查询并获取查询数据 QueryResponse queryResponse = this.httpSolrServer.query(solrQuery); List<Product> products = queryResponse.getBeans(Product.class); return products; } }
2023-08-19 03:34:141

如何使solr查询结果带score

 一、 查询参数说明在做solr查询的时候,solr提供了很多参数来扩展它自身的强大功能!以下是使用频率最高的一些参数!1、常用q - 查询字符串,这个是必须的。如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京)fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=Name:张三&fq=CreateDate:[20081001 TO 20091031],找关键字mm,并且CreateDate是20081001fl - 指定返回那些字段内容,用逗号或空格分隔多个。
2023-08-19 03:34:221

如何在Ubuntu上安装Solr

安装Apache Solr首先,让我们从以下位置下载最新版本的Apache Solr:文件: solr-5.3.1.tgz一旦文件下载,在/ opt下创建一个名为solr的目录并移动下载的文件。 现在导航到目录/opt/solr并使用以下命令解压缩该文件。sudo tar -xvf solr-5.3.1.tgzSolr命令必须从bin目录中执行,因此请导航到以下路径。/opt/solr/solr-5.3.1/bin提取的目录将如下所示。Solr Ubuntu文件夹bin文件夹包含用于启动和停止服务器的脚本。 example文件夹包含几个示例文件。 我们将使用其中一个来演示Solr如何对数据进行索引。server文件夹包含用于写入所有Solr日志的logs文件夹。在索引期间检查日志中的任何错误将有所帮助。 服务器下的solr文件夹包含不同的集合或核心。 每个核/集合的配置和数据存储在相应的核/集合文件夹中。Apache Solr附带了一个内置的Jetty服务器。 但在我们启动solr实例之前,我们必须验证JAVA_HOME是否在机器上设置。现在使用以下命令启动Solr服务器。sudo ./solr start这将在默认端口8983下启动Solr服务器。我们现在可以在浏览器中打开以下URL,并验证我们的Solr实例正在运行。
2023-08-19 03:34:301

solr和elasticsearch有什么优缺点

从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。单机对比1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 3092730 条记录,约合 3682条/秒。2. 3百万条记录的情况下,模糊查询和排序基本都在1秒内返回3. 刚才的测试,是每个field单独存储,现在修改了一下配置文件,增加了一个copyField,所有的field都拷贝一份到text这个field里面去,导入的性能大概是:19分钟导入了3092730 条记录,约合 2713条/秒4. 3百万条记录的情况下,针对text的模糊查询基本在1秒内返回,但是针对所有记录的排序,大概要2~3秒5. 使用 elasticsearch 0.19.8,缺省配置,用单任务导入,导入性能是:20分钟导入了3092730 条记录,约合2577条/秒6. 3百万条记录的情况下,查询基本上在1秒内返回,但是模糊查询比较慢,第一次要10秒,后来大概要1~3秒。加上排序大概需要5秒,整体排序基本100ms查询及排序的指令:{ "query": { "query_string": { "query": "*999*" } }, "sort": [ { "TIME_UP": { "order": "asc" } } ]}7. Es0.19.8,用两个任务导入,导入性能是:13分钟导入了3092730 条记录,约合3965条/秒8. Solr全部建好索引后,占用磁盘空间是1.2G,es占用磁盘空间是4G单机对比2在一台Intel i7,32G内存的机器上,重新跑这两个的对比。不过有个重大的区别在于,Solr是在这台性能很好的机器上跑,而es的导入进程则是在一台Intel 四核 2.5G,4G内存的机器上跑的,也许会有性能的差异。ES版本0.19.8,Solr版本4.0-ALPHA。1. Solr的导入性能:3400万条记录,用时62分钟,平均9140条/秒,占用空间12.75G2. 使用 *999* 这样的模糊查询,3秒以内返回,稍长一点的查询条件 *00100014*,也是2~3秒返回3. Es的导入性能(设置Xmx为10G):3400万条记录,用时40分钟,平均14167条/秒,占用空间33.26G,客户端采用4个并发。4. 使用 *999* 这样的模糊查询,9秒返回,稍长一点的查询条件 *00100014*,11.8秒返回5. 如果不是针对所有字段查询,而是针对某个特定字段,比如 SAM_CODE: *00100014*,那么也是1秒以内返回。6. 结论:es的查询效率也可以很高,只是我们还不会用。7. 结论2:es有个设置是把所有字段放一块的那个,缺省是放一起,但是不知道为什么没起到应有的作用。备注:1. Solr第一次的那个内存使用的是缺省设置,这次改为10G,结果导入性能反而变差了,400万条记录,用了8分钟,平均8333条/秒,不知道为什么。2. 改回缺省的内存配置,导入速度仍然慢。3. 重启Linux,用10G的内存配置,再导入,5030万条记录,用时92分,约9112条/秒,说明导入速度和内存配置没有大差别4. 在10G配置的情况下,检索速度也差别不大。5. 为了搞清楚lucene4.0和solr4.0的进步有多大,下载了solr3.6.1,所幸的是4.0的配置文件在3.6.1上也可以用,所以很快就搭起来进行测试,导入性能为:3400万条记录,用时55分钟,约10303条/秒,占用空间13.85G。查询性能:*999*第一次11.6s,*00100014* 27.3s,相比4.0ALPHA的结果(5000万结果当中,*999*第一次2.6s,*00100014*第一次2.5s)来说,慢了很多,与es的性能差不多,因此,也许lucene4.0真的对性能有大幅提升?集群对比:采用4台同样配置(Intel i7,32G内存)的Centos 6.3组成的集群,进行对比。1. 首先是es,很方便的就组成了一个Cluster,等上一个3400万条的Index全部均衡负载之后进行测试,导入到另外一个Index当中。2. 导入性能:8500万条记录,用时72分钟,约为19676条/秒。在前5千万条记录导入时的速度在2万/条以上,初始的速度在2.2万/条。占用空间78.6G(由于有冗余,实际占用空间为157.2G)3. 查询性能:*999*第一次13.5秒,第二次19.5秒,第三次7.4秒,第四次7.1秒,第五次7.1秒*00100014*第一次17.2秒,第二次16.6秒,第三次17.9秒,第四次16.7秒,第五次17.1秒SAM_CODE:*999*,0.8s,1.3s,0.02s,0.02s,0.02sSAM_CODE: *00100014*,0.1s,0.1s,0.02s,0.03s,0.05s4. Solr4.0-ALPHA,SolrCloud的配置还算简单,启动一个ZooKeeper,然后其他三台机器访问这个地址,就可以组成一个Cloud:机器1: nohup java -Xms10G -Xmx10G -Xss256k -Djetty.port=8983 -Dsolr.solr.home="./example-DIH/solr/" -Dbootstrap_confdir=./example-DIH/solr/db/conf/ -Dcollection.configName=xabconf3 -DzkRun -DnumShards=4 -jar start.jar &其他机器:nohup java -Xms10G -Xmx10G -Dsolr.solr.home="./example-DIH/solr/" -DzkHost=192.168.2.11:9983 -jar start.jar &但是在执行 data import 的时候,频繁出现 OutOfMemoryError: unable to create new native thread。查了很多资料,把Linux的ulimit当中的nproc改成10240,把Xss改成256K,都解决不了问题。暂时没有办法进行。结论1. 导入性能,es更强2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。
2023-08-19 03:34:581

关于Solr 谁可以告诉我这个问题怎么解决

最近搭建一个全文检索平台。最初考虑只采用lucene,然后自己写索引构建程序、检索框架等,类似osc @红薯 的方案,以前也做过比较熟悉。但有两个问题,1.比较复杂,工作量和维护量都比较大。2. 检索会有一定的延时。 看了看Solr决定采用solr,可以节省很大一部分开发时间。但有几个问题想请教下 osc 里的全文检索高手,希望大家不吝赐教: 1.第一种方案,solr配置数据库,自动处理建索引。这样会不会延时很大,无法做到实时检索? 2.第二种方案,通过solrj客户端在应用端 处理建索引问题,比如在发布一篇文章的时候,通过http 提交到solr 服务端上同时建索引,这样能不能达到实时检索?而且同时这个时候 应用端也会通过 http 检索 solr, 建索引检索同时进行,这样访问量大的时候会不会导致 内存泄露、索引文件磁盘I/O负载不了的问题?有经验的同学能不能讨论下?那种方案较好点,对实时性要求高点。或者配置上怎么优化?当然这个项目是企业内部应用,访问量不会太大,服务器资源有限,所以无法用到solr的分布式特性,比如索引复制、多核来解决这些问题。而且由于可能会部署在 windows下,排除了以前做过的sphinx、nlpbamboo 基于Postgresql数据库的方案。
2023-08-19 03:35:051

solr 什么是全量索引和增量索引

增量索引index定义配置如下#增量索引 index定义index delta:mysql{source = deltapath = /usr/local/coreseek/var/data/delta/charset_dictpath = /usr/local/mmseg3/etc/charset_type = zh_cn.utf-8}
2023-08-19 03:35:131

Sola用日文翻译是天空,Solr是什么。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。 百度上有解释的。
2023-08-19 03:35:201

solr怎么多表联合查询

1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war。2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties文件复制到tomcat_dir/lib目录下;切把 solr-4.7.1/example/solr,复制到tomcat_dir/bin下。3、修改tomcat_dir/conf/server.xml<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" />4、创建solr.xml,存放在路径:tomcat/conf/Catalina/localhost/solr.xml,内容:<Context path="/solr" docBase="C:Tomcat 7.0webappssolr.war"debug="0" crossContext="true"><Environment name="solr/home" type="java.lang.String" value="C:Tomcat 7.0insolr" override="true" /></Context>PS:上面的docBase和value路径中不能存在中文字符,否则会出现404错误。5、将C:Tomcat 7.0webapps下的solr.war包,启动项目解压;然后再添加几个jar包:solr-4.7.1distsolr-dataimporthandler-4.7.1.jar;solr-4.7.1distsolr-dataimporthandler-extras-4.7.1.jar;还要加载数据库驱动包:mysql-connector-java-3.1.13-bin.jar6、在C:Tomcat 7.0insolrcollection1conf 下的solrconfig.xml增加以下数据库配置:<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>7、将tomcatinsolrcollection1conf下增加data-config.xml文件,内容如下:<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.221:3306/tmsdb" user="root" password="123456"/> <document name="content"> <entity name="node" query="select id,author,title,content from solrdb"> <field column="id" name="id" /> <field column="author" name="author" /> <field column="title" name="title" /> <field column="content" name="content" /></entity> </document> </dataConfig>8、增加中文分词器,ik-analyzer的配置如下:①目前的中文分词主要有两种 1,基于中科院ICTCLAS的隐式马尔科夫hhmm算法的中文分词器,例如smartcn等。(不支持自定义扩展词库) 2,基于正向迭代最细粒度切分算法(正向最大匹配并且最细分词)例如IK,庖丁等(支持自定义扩展词库) 安装分词前,可以去下载IK的分词包 :IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar下载完毕后,将此包放进tomcatsolr的WEB-INFlib下面:tomcatwebappssolrWEB-INFlib 。下面需要在solr的schemal.xml进行分词器注册:<!-- 配置IK分词器 --> <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/> --> </analyzer> <analyzer type="query"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>--> </analyzer> </fieldType>最后还得配置一个引用字段就OK了<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>②它的安装部署十分简单,将IKAnalyzer2012.jar部署亍项目的lib目录中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目录(对于web项目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然后配置solr4.7中schema.xml配置解析器:<schema name="example" version="1.1"> …… <fieldType name="text" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>…… </schema>
2023-08-19 03:36:111

Solr 配置DataImport出错是什么原因?

王者荣耀里面的吕布上了妲己,赵云恋上了貂蝉,程咬金绑架了王昭君,嘿哈
2023-08-19 03:36:191

solr怎么设置才能像数据库中的like模糊查询

可以试试:使用SolrQuery对象,SolrQuery solrQuery = new SolrQuery(); //组装查询条件solrQuery.setQuery("*:*");String key = "java3";solrQuery.addFilterQuery("content:" + "*"+key+"*" );试试吧
2023-08-19 03:37:281

solr如何让全词匹配结果在最前面

先,只要在搜索的时候增加title字段的权重即可,如果改动较小的情况下,updatetime靠前,标题匹配靠前,这个比较容易sort=updatetime desc 其次,如果想绝对的靠前
2023-08-19 03:37:361

如何把elasticsearch换成solr架构

从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。单机对比1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 3092730 条记录,约合 3682条/秒。2. 3百万条记录的情况下,模糊查询和排序基本都在1秒内返回3. 刚才的测试,是每个field单独存储,现在修改了一下配置文件,增加了一个copyField,所有的field都拷贝一份到text这个field里面去,导入的性能大概是:19分钟导入了3092730 条记录,约合 2713条/秒4. 3百万条记录的情况下,针对text的模糊查询基本在1秒内返回,但是针对所有记录的排序,大概要2~3秒5. 使用 elasticsearch 0.19.8,缺省配置,用单任务导入,导入性能是:20分钟导入了3092730 条记录,约合2577条/秒6. 3百万条记录的情况下,查询基本上在1秒内返回,但是模糊查询比较慢,第一次要10秒,后来大概要1~3秒。加上排序大概需要5秒,整体排序基本100ms查询及排序的指令:{ "query": { "query_string": { "query": "*999*" } }, "sort": [ { "TIME_UP": { "order": "asc" } } ]}7. Es0.19.8,用两个任务导入,导入性能是:13分钟导入了3092730 条记录,约合3965条/秒8. Solr全部建好索引后,占用磁盘空间是1.2G,es占用磁盘空间是4G单机对比2在一台Intel i7,32G内存的机器上,重新跑这两个的对比。不过有个重大的区别在于,Solr是在这台性能很好的机器上跑,而es的导入进程则是在一台Intel 四核 2.5G,4G内存的机器上跑的,也许会有性能的差异。ES版本0.19.8,Solr版本4.0-ALPHA。1. Solr的导入性能:3400万条记录,用时62分钟,平均9140条/秒,占用空间12.75G2. 使用 *999* 这样的模糊查询,3秒以内返回,稍长一点的查询条件 *00100014*,也是2~3秒返回3. Es的导入性能(设置Xmx为10G):3400万条记录,用时40分钟,平均14167条/秒,占用空间33.26G,客户端采用4个并发。4. 使用 *999* 这样的模糊查询,9秒返回,稍长一点的查询条件 *00100014*,11.8秒返回5. 如果不是针对所有字段查询,而是针对某个特定字段,比如 SAM_CODE: *00100014*,那么也是1秒以内返回。6. 结论:es的查询效率也可以很高,只是我们还不会用。7. 结论2:es有个设置是把所有字段放一块的那个,缺省是放一起,但是不知道为什么没起到应有的作用。备注:1. Solr第一次的那个内存使用的是缺省设置,这次改为10G,结果导入性能反而变差了,400万条记录,用了8分钟,平均8333条/秒,不知道为什么。2. 改回缺省的内存配置,导入速度仍然慢。3. 重启Linux,用10G的内存配置,再导入,5030万条记录,用时92分,约9112条/秒,说明导入速度和内存配置没有大差别4. 在10G配置的情况下,检索速度也差别不大。5. 为了搞清楚lucene4.0和solr4.0的进步有多大,下载了solr3.6.1,所幸的是4.0的配置文件在3.6.1上也可以用,所以很快就搭起来进行测试,导入性能为:3400万条记录,用时55分钟,约10303条/秒,占用空间13.85G。查询性能:*999*第一次11.6s,*00100014* 27.3s,相比4.0ALPHA的结果(5000万结果当中,*999*第一次2.6s,*00100014*第一次2.5s)来说,慢了很多,与es的性能差不多,因此,也许lucene4.0真的对性能有大幅提升?集群对比:采用4台同样配置(Intel i7,32G内存)的Centos 6.3组成的集群,进行对比。1. 首先是es,很方便的就组成了一个Cluster,等上一个3400万条的Index全部均衡负载之后进行测试,导入到另外一个Index当中。2. 导入性能:8500万条记录,用时72分钟,约为19676条/秒。在前5千万条记录导入时的速度在2万/条以上,初始的速度在2.2万/条。占用空间78.6G(由于有冗余,实际占用空间为157.2G)3. 查询性能:*999*第一次13.5秒,第二次19.5秒,第三次7.4秒,第四次7.1秒,第五次7.1秒*00100014*第一次17.2秒,第二次16.6秒,第三次17.9秒,第四次16.7秒,第五次17.1秒SAM_CODE:*999*,0.8s,1.3s,0.02s,0.02s,0.02sSAM_CODE: *00100014*,0.1s,0.1s,0.02s,0.03s,0.05s4. Solr4.0-ALPHA,SolrCloud的配置还算简单,启动一个ZooKeeper,然后其他三台机器访问这个地址,就可以组成一个Cloud:机器1: nohup java -Xms10G -Xmx10G -Xss256k -Djetty.port=8983 -Dsolr.solr.home="./example-DIH/solr/" -Dbootstrap_confdir=./example-DIH/solr/db/conf/ -Dcollection.configName=xabconf3 -DzkRun -DnumShards=4 -jar start.jar &其他机器:nohup java -Xms10G -Xmx10G -Dsolr.solr.home="./example-DIH/solr/" -DzkHost=192.168.2.11:9983 -jar start.jar &但是在执行 data import 的时候,频繁出现 OutOfMemoryError: unable to create new native thread。查了很多资料,把Linux的ulimit当中的nproc改成10240,把Xss改成256K,都解决不了问题。暂时没有办法进行。结论1. 导入性能,es更强2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。
2023-08-19 03:37:561

如何理解solr的core和collection

1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war。2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties文件复制到tomcat_dir/lib目录下;切把 solr-4.7.1/example/solr,复制到tomcat_dir/bin下。3、修改tomcat_dir/conf/server.xml<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" />4、创建solr.xml,存放在路径:tomcat/conf/Catalina/localhost/solr.xml,内容:<Context path="/solr" docBase="C:Tomcat 7.0webappssolr.war"debug="0" crossContext="true"><Environment name="solr/home" type="java.lang.String" value="C:Tomcat 7.0insolr" override="true" /></Context>PS:上面的docBase和value路径中不能存在中文字符,否则会出现404错误。5、将C:Tomcat 7.0webapps下的solr.war包,启动项目解压;然后再添加几个jar包:solr-4.7.1distsolr-dataimporthandler-4.7.1.jar;solr-4.7.1distsolr-dataimporthandler-extras-4.7.1.jar;还要加载数据库驱动包:mysql-connector-java-3.1.13-bin.jar6、在C:Tomcat 7.0insolrcollection1conf 下的solrconfig.xml增加以下数据库配置:<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>7、将tomcatinsolrcollection1conf下增加data-config.xml文件,内容如下:<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.221:3306/tmsdb" user="root" password="123456"/> <document name="content"> <entity name="node" query="select id,author,title,content from solrdb"> <field column="id" name="id" /> <field column="author" name="author" /> <field column="title" name="title" /> <field column="content" name="content" /></entity> </document> </dataConfig>8、增加中文分词器,ik-analyzer的配置如下:①目前的中文分词主要有两种 1,基于中科院ICTCLAS的隐式马尔科夫hhmm算法的中文分词器,例如smartcn等。(不支持自定义扩展词库) 2,基于正向迭代最细粒度切分算法(正向最大匹配并且最细分词)例如IK,庖丁等(支持自定义扩展词库) 安装分词前,可以去下载IK的分词包 :IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar下载完毕后,将此包放进tomcatsolr的WEB-INFlib下面:tomcatwebappssolrWEB-INFlib 。下面需要在solr的schemal.xml进行分词器注册:<!-- 配置IK分词器 --> <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/> --> </analyzer> <analyzer type="query"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>--> </analyzer> </fieldType>最后还得配置一个引用字段就OK了<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>②它的安装部署十分简单,将IKAnalyzer2012.jar部署亍项目的lib目录中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目录(对于web项目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然后配置solr4.7中schema.xml配置解析器:<schema name="example" version="1.1"> …… <fieldType name="text" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>…… </schema>
2023-08-19 03:38:041

solr怎么设置才能像数据库中的like模糊查询

可以试试:使用SolrQuery对象,SolrQuery solrQuery = new SolrQuery(); //组装查询条件solrQuery.setQuery("*:*");String key = "java3";solrQuery.addFilterQuery("content:" + "*"+key+"*" );试试吧
2023-08-19 03:38:131

solr ext.dic哪里有

1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war。2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties文件复制到tomcat_dir/lib目录下;切把 solr-4.7.1/example/solr,复制到tomcat_dir/bin下。3、修改tomcat_dir/conf/server.xml<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" />4、创建solr.xml,存放在路径:tomcat/conf/Catalina/localhost/solr.xml,内容:<Context path="/solr" docBase="C:Tomcat 7.0webappssolr.war"debug="0" crossContext="true"><Environment name="solr/home" type="java.lang.String" value="C:Tomcat 7.0insolr" override="true" /></Context>PS:上面的docBase和value路径中不能存在中文字符,否则会出现404错误。5、将C:Tomcat 7.0webapps下的solr.war包,启动项目解压;然后再添加几个jar包:solr-4.7.1distsolr-dataimporthandler-4.7.1.jar;solr-4.7.1distsolr-dataimporthandler-extras-4.7.1.jar;还要加载数据库驱动包:mysql-connector-java-3.1.13-bin.jar6、在C:Tomcat 7.0insolrcollection1conf 下的solrconfig.xml增加以下数据库配置:<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>7、将tomcatinsolrcollection1conf下增加data-config.xml文件,内容如下:<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.221:3306/tmsdb" user="root" password="123456"/> <document name="content"> <entity name="node" query="select id,author,title,content from solrdb"> <field column="id" name="id" /> <field column="author" name="author" /> <field column="title" name="title" /> <field column="content" name="content" /></entity> </document> </dataConfig>8、增加中文分词器,ik-analyzer的配置如下:①目前的中文分词主要有两种 1,基于中科院ICTCLAS的隐式马尔科夫hhmm算法的中文分词器,例如smartcn等。(不支持自定义扩展词库) 2,基于正向迭代最细粒度切分算法(正向最大匹配并且最细分词)例如IK,庖丁等(支持自定义扩展词库) 安装分词前,可以去下载IK的分词包 :IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar下载完毕后,将此包放进tomcatsolr的WEB-INFlib下面:tomcatwebappssolrWEB-INFlib 。下面需要在solr的schemal.xml进行分词器注册:<!-- 配置IK分词器 --> <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/> --> </analyzer> <analyzer type="query"> <!-- 分词--> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> <!-- 禁用词过滤根据情况使用--> <!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>--> </analyzer> </fieldType>最后还得配置一个引用字段就OK了<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>②它的安装部署十分简单,将IKAnalyzer2012.jar部署亍项目的lib目录中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目录(对于web项目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然后配置solr4.7中schema.xml配置解析器:<schema name="example" version="1.1"> …… <fieldType name="text" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>…… </schema>
2023-08-19 03:38:211

如何用Solr搭建大数据查询平台

0×00 开头照例扯淡自从各种脱裤门事件开始层出不穷,在下就学乖了,各个地方的密码全都改成不一样的,重要帐号的密码定期更换,生怕被人社出祖宗十八代的我,甚至开始用起了假名字,我给自己起一新网名”兴才”,这个看起来还不错的名字,其实是我们家乡骂人土话,意思是脑残人士…. -_-|||额好吧,反正是假的,不要在意这些细节。这只是名,至于姓氏么,每个帐号的注册资料那里,照着百家姓上赵钱孙李周吴郑王的依次往下排,什么张兴才、李兴才、王兴才……于是也不知道我这样”兴才”了多久,终于有一天,我接到一个陌生电话:您好,请问是马兴才先生吗?好么,该来的终于还是来了,于是按名索骥,得知某某网站我用了这个名字,然后通过各种途径找,果然,那破站被脱裤子了。果断Down了那个裤子,然后就一发不可收拾,走上了收藏裤子的不归路,直到有一天,我发现收藏已经非常丰富了,粗略估计得好几十亿条数据,拍脑袋一想,这不能光收藏啊,我也搭个社工库用吧……0×01 介绍社工库怎么搭呢,这种海量数据的东西,并不是简单的用mysql建个库,然后做个php查询select * from sgk where username like ‘%xxxxx%"这样就能完事的,也不是某些幼稚骚年想的随便找个4g内存,amd双核的破电脑就可以带起来的,上面这样的语句和系统配置,真要用于社工库查询,查一条记录恐怕得半小时。好在这个问题早就被一种叫做全文搜索引擎的东西解决了,更好的消息是,全文搜索引擎大部分都是开源的,不需要花钱。目前网上已经搭建好的社工库,大部分是mysql+coreseek+php架构,coreseek基于sphinx,是一款优秀的全文搜索引擎,但缺点是比较轻量级,一旦数据量过数亿,就会有些力不从心,并且搭建集群做分布式性能并不理想,如果要考虑以后数据量越来越大的情况,还是得用其他方案,为此我使用了solr。Solr的基础是著名的Lucene框架,基于java,通过jdbc接口可以导入各种数据库和各种格式的数据,非常适合开发企业级的海量数据搜索平台,并且提供完善的solr cloud集群功能,更重要的是,solr的数据查询完全基于http,可以通过简单的post参数,返回json,xml,php,python,ruby,csv等多种格式。以前的solr,本质上是一组servlet,必须放进Tomcat才能运行,从solr5开始,它已经自带了jetty,配置的好,完全可以独立使用,并且应付大量并发请求,具体的架构我们后面会讲到,现在先来进行solr的安装配置。0×02 安装和配置以下是我整个搭建和测试过程所用的硬件和软件平台,本文所有内容均在此平台上完成:软件配置: solr5.5,mysql5.7,jdk8,Tomcat8 Windows10/Ubuntu14.04 LTS硬件配置: i7 4770k,16G DDR3,2T西数黑盘2.1 mysql数据库Mysql数据库的安装和配置我这里不再赘述,只提一点,对于社工库这种查询任务远远多于插入和更新的应用来说,最好还是使用MyISAM引擎。搭建好数据库后,新建一个库,名为newsgk,然后创建一个表命名为b41sgk,结构如下:id bigint 主键 自动增长username varchar 用户名email varchar 邮箱password varchar 密码salt varchar 密码中的盐或者第二密码ip varchar ip、住址、电话等其他资料site varchar 数据库的来源站点接下来就是把收集的各种裤子全部导入这个表了,这里推荐使用navicat,它可以支持各种格式的导入,具体过程相当的枯燥乏味,需要很多的耐心,这里就不再废话了,列位看官自己去搞就是了,目前我初步导入的数据量大约是10亿条。2.2 Solr的搭建和配置首先下载solr:$ wget http://mirrors.hust.edu.cn/apache/lucene/solr/5.5.0/solr-5.5.0.tgz解压缩:$ tar zxvf solr-5.5.0.tgz安装jdk8:$ sudo add-apt-repository ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get install oracle-java8-installer$ sudo apt-get install oracle-java8-set-default因为是java跨平台的,Windows下和linux下solr是同一个压缩包,windows下jdk的安装这里不再说明。进入解压缩后的solr文件夹的bin目录,solr.cmd和solr分别是windows和linux下的启动脚本:因为社工库是海量大数据,而jvm默认只使用512m的内存,这远远不够,所以我们需要修改,打开solr.in.sh文件,找到这一行:SOLR_HEAP=”512m”依据你的数据量,把它修改成更高,我这里改成4G,改完保存. 在windows下略有不同,需要修改solr.in.cmd文件中的这一行:set SOLR_JAVA_MEM=-Xms512m -Xmx512m同样把两个512m都修改成4G。Solr的启动,重启和停止命令分别是:$ ./solr start$ ./solr restart –p 8983$ ./solr stop –all在linux下还可以通过install_solr_service.sh脚本把solr安装为服务,开机后台自动运行。Solr安装完成,现在我们需要从mysql导入数据,导入前,我们需要先创建一个core,core是solr的特有概念,每个core是一个查询、数据,、索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新core:在solr-5.5.0/server/solr子目录下面建立一个新文件夹,命名为solr_mysql,这个是core的名称,在下面创建两个子目录conf和data,把solr-5.5.0/solr-5.5.0/example/example-DIH/solr/db/conf下面的所有文件全部拷贝到我们创建的conf目录中.接下来的配置主要涉及到三个文件, solrconfig.xml, schema.xml和db-data-config.xml。首先打开db-data-config.xml,修改为以下内容:<dataConfig> <dataSource name="sgk" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/newsgk" user="root" password="password" batchSize="-1" /> <document name="mysgk"> <entity name="b41sgk" pk="id" query="select * from b41sgk"> <field column="id" name="id"/> <field column="username" name="username"/> <field column="email" name="email"/> <field column="password" name="password"/> <field column="salt" name="salt"/> <field column="ip" name="ip"/> <field column="site" name="site"/> </entity> </document></dataConfig>这个文件是负责配置导入数据源的,请按照mysql实际的设置修改datasource的内容,下面entity的内容必须严格按照mysql中社工库表的结构填写,列名要和数据库中的完全一样。然后打开solrconfig.xml,先找到这一段: <schemaFactory class="ManagedIndexSchemaFactory"> <bool name="mutable">true</bool> <str name="managedSchemaResourceName">managed-schema</str> </schemaFactory>把它全部注释掉,加上一行,改成这样: <!-- <schemaFactory class="ManagedIndexSchemaFactory"> <bool name="mutable">true</bool> <str name="managedSchemaResourceName">managed-schema</str> </schemaFactory>--> <schemaFactory class="ClassicIndexSchemaFactory"/>这是因为solr5 以上默认使用managed-schema管理schema,需要更改为可以手动修改。然后我们还需要关闭suggest,它提供搜索智能提示,在社工库中我们用不到这样的功能,重要的是,suggest会严重的拖慢solr的启动速度,在十几亿数据的情况下,开启suggest可能会导致solr启动加载core长达几个小时!同样在solrconfig.xml中,找到这一段: <searchComponent name="suggest" class="solr.SuggestComponent"> <lst name="suggester"> <str name="name">mySuggester</str> <str name="lookupImpl">FuzzyLookupFactory</str> <!-- org.apache.solr.spelling.suggest.fst --> <str name="dictionaryImpl">DocumentDictionaryFactory</str> <!-- org.apache.solr.spelling.suggest.HighFrequencyDictionaryFactory --> <str name="field">cat</str> <str name="weightField">price</str> <str name="suggestAnalyzerFieldType">string</str> </lst> </searchComponent> <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy"> <lst name="defaults"> <str name="suggest">true</str> <str name="suggest.count">10</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>把这些全部删除,然后保存solrconfig.xml文件。接下来把managed-schema拷贝一份,重命名为schema.xml (原文件不要删除),打开并找到以下位置:只保留_version_和_root_节点,然后把所有的field,dynamicField和copyField全部删除,添加以下的部分: <field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" /> <field name="username" type="text_ik" indexed="true" stored="true"/> <field name="email" type="text_ik" indexed="true" stored="true"/> <field name="password" type="text_general" indexed="true" stored="true"/> <field name="salt" type="text_general" indexed="true" stored="true"/> <field name="ip" type="text_general" indexed="true" stored="true"/> <field name="site" type="text_general" indexed="true" stored="true"/> <field name="keyword" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="username" dest="keyword"/> <copyField source="email" dest="keyword"/> <uniqueKey>id</uniqueKey>这里的uniqueKey是配置文件中原有的,用来指定索引字段,必须保留。新建了一个字段名为keyword,它的用途是联合查询,即当需要同时以多个字段做关键字查询时,可以用这一个字段名代替,增加查询效率,下面的copyField即用来指定复制哪些字段到keyword。注意keyword这样的字段,后面的multiValued属性必须为true。username和email以及keyword这三个字段,用来检索查询关键字,它们的类型我们指定为text_ik,这是一个我们创造的类型,因为solr虽然内置中文分词,但效果并不好,我们需要添加IKAnalyzer中文分词引擎来查询中文。在https://github.com/EugenePig/ik-analyzer-solr5下载IKAnalyzer for solr5的源码包,然后使用Maven编译,得到一个文件IKAnalyzer-5.0.jar,把它放入solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后在solrconfig.xml的fieldType部分加入以下内容: <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>保存后,core的配置就算完成了,不过要导入mysql数据,我们还需要在mysql网站上下载mysql-connector-java-bin.jar库文件,连同solr-5.5.0/dist目录下面的solr-dataimporthandler-5.5.0.jar,solr-dataimporthandler-extras-5.5.0.jar两个文件,全部拷贝到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目录中,然后重启solr,就可以开始数据导入工作了。
2023-08-19 03:38:321

solr中文搜索词组问题

可能是中文分词存在问题,可以在网页上测试分词字段的分词效果,例如下图:若是上述效果,就不会存在你那种问题,但如果是网站被分成了“网”“站”则说明分词不对
2023-08-19 03:38:401

solr 客户端加访问用户名密码后 后端程序怎么访问

设置访问策略具体参考
2023-08-19 03:38:541

solr 改了dataimport.properties配置文件得重启吗

从5.0开始,solr采用了自动发现模式(discovery,区别于传统模式legacy),Solr会自动找到安装目录中、或solr_home中的配置文件:core.properties,并根据里面的name属性来初始化相对于的core。solr.xml中仍然会定义一些配置参数,但是core本身不会定义在这个文件中。Solr会递归搜索所有solr和solr_home目录和子目录,当在一个目录中发现core.properties后,就停止搜索当前目录的所有子目录,转向下一个同级目录搜索。所以,下面两个配置只有第一个生效:./cores/core1/core.properties./cores/core1/coremore/core5/core.properties而下面三个配置,都会生效:./cores/somecores/core1/core.properties./cores/somecores/core2/core.properties./cores/othercores/core3/core.properties一个core.properties文件代表一个core。文件的内容可以是空的,这个时候,solr会把该文件所在的目录作为name,比如跟./cores/core1/core.properties对应的core name就是core1;instanceDir就是./cores/core1;dataDir就是./cores/core1/data,等等。core.properties配置参数:
2023-08-19 03:39:021

solr重启导致数据丢失,与solr.war的修改有关系吗

solr重启导致数据丢失,与solr.war的修改有关系从5.0开始,solr采用了自动发现模式(discovery,区别于传统模式legacy),Solr会自动找到安装目录中、或solr_home中的配置文件:core.properties,并根据里面的name属性来初始化相对于的core。solr.xml中仍然会定义一些配置参数,但是core本身不会定义在这个文件中。Solr会递归搜索所有solr和solr_home目录和子目录,当在一个目录中发现core.properties后,就停止搜索当前目录的所有子目录,转向下一个同级目录搜索。所以,下面两个配置只有第一个生效:./cores/core1/core.properties./cores/core1/coremore/core5/core.properties而下面三个配置,都会生效:./cores/somecores/core1/core.properties./cores/somecores/core2/core.properties./cores/othercores/core3/core.properties一个core.properties文件代表一个core。文件的内容可以是空的,这个时候,solr会把该文件所在的目录作为name,比如跟./cores/core1/core.properties对应的core name就是core1;instanceDir就是./cores/core1;dataDir就是./cores/core1/data,等等。core.properties配置参数:
2023-08-19 03:39:111