知识点

相关文章

更多

最近更新

更多

利用SOLR搭建企业搜索平台 之七(solr使用问题集)

2019-03-27 01:02|来源: 网路

某日,突发奇想,想写这么一个博客,希望记录下所有在solr中使用的毛病。而且我希望广大的看友们也能一起来说说你们平时遇到的各种错误,这样大家才能一起更好的进步!

话不多说,进入正题

1》solr 做索引时报 Lock obtain timed out: SingleInstanceLock: write.lock
有个频繁做索引的应用,它同时也对外提供搜索服务。大部分是 solr 1.3 的默认配置。solr 做索引,有时候报:

Xml代码
  1. 2009-7-13 9:48:06 org.apache.solr.common.SolrException log  
  2. 严重: org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: SingleInstanceLock: write.lock  
  3.         at org.apache.lucene.store.Lock.obtain(Lock.java:85)  
  4.         at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1140)  
  5.         at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:938)  
  6.         at org.apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.java:116)  
  7. ...  

是写锁取不到。但重启 solr 又可以正常做,主要是运行时间长了就报这个错了。还是看下配置吧。

看到 solr 1.3 默认的配置是:

Xml代码
  1. <indexDefaults>    
  2.     <!-- ... -->    
  3.     <!--    
  4.       This option specifies which Lucene LockFactory implementation to use.    
  5.     
  6.       single = SingleInstanceLockFactory - suggested for a read-only index    
  7.                or when there is no possibility of another process trying    
  8.                to modify the index.    
  9.       native = NativeFSLockFactory    
  10.       simple = SimpleFSLockFactory    
  11.     
  12.       (For backwards compatibility with Solr 1.2, 'simple' is the default    
  13.        if not specified.)    
  14.     -->    
  15.     <lockType>single</lockType>    
  16. </indexDefaults>   

默认锁是 single ,只读的。solr 1.2 是 simple,把它改回去了,运行了几天,没事。

2》lucene & solr optimize 索引后结果与平台有点关系
昨日做索引的程序重构下,测试 optimize 索引(在原有数据基础上提交索引)时,在开发的机器(windows)里总是会有两段索引,要再 optimize 才只是一个索引段,当然不是设置 maxSegments=2。反复运行还是如此,为了说明是否写的程序有问题,就用 solr 自带的 post.sh (或 post.jar)提交 optimize。结果还是有两段,再提交一次optimize 才是一个段。这问题……

旧的程序运行得很正常,看了下它也没有提交两次优化。然后把新的程序也放到服务器(linux)上运行,结果是只有一个段。

恩,可以认为是与文件系统有关,optimize 的时候是先新生成一段,然后再删除旧的索引,windows 可能是这样在运行期间与文件关联着删除不了旧的。linux 可能是不用(不打开)文件就可以删除。现只能这样简单解释。

3》换 solr 里的 lucene 包
solr 1.3 发布的时候,lucene 2.4还没有正式发布,其的 lucene 是开发版,现在lucene 2.4早已发布,那就换上新的 lucene 吧。

下载 solr 1.3 http://labs.xiaonei.com/apache-mirror/lucene/solr/1.3.0/apache-solr-1.3.0.zip 和 lucene 2.4 http://labs.xiaonei.com/apache-mirror/lucene/java/lucene-2.4.0.zip 到目录如e:/search/,

把 e:/search/apache-solr-1.3/lib 目录下的 lucene 相关的*.jar删除:

lucene-analyzers-2.4-dev.jar
lucene-core-2.4-dev.jar
lucene-highlighter-2.4-dev.jar
lucene-memory-2.4-dev.jar
lucene-queries-2.4-dev.jar
lucene-snowball-2.4-dev.jar
lucene-spellchecker-2.4-dev.jar

从 e:/search/lucene-2.4/(或contrib/)目录下找到对应的放到solr-1.3/lib下

然后构建 solr,到e:/search/apache-solr-1.3目录,ant dist-war

4》solr q查询容错性
当solr接收没q参数(或q参数值为空)请求时,会报错。报错十分讨厌,对开发调试时才比较有用,但实际运行环境报错就不太好了,java异常可能有点性能消耗,那干脆就返回正常的结果好了(只是结果里没有找到的数据)。

solr 1.3 可以写个组件去做。判断到空的时候,加一个q参数,其值为在索引里没有的数据。这样就可以返回没有数据的结果。

其实这样实现还是比较麻烦。可以在 solrconfig.xml的requestHandler里加一个默认参数。如q=abcdefghijk。配置如下:

Xml代码
  1. <requestHandler name="standard" class="solr.SearchHandler" default="true">    
  2.    <lst name="defaults">    
  3.      <str name="q">abcdefghijk</str>    
  4.    </lst>    
  5. </requestHandler>   

这样的话查询容错性比较好,查询请求没有带q参数也可,q参数值为空也可。tomcat不会报错,还可以返回结果。
转自:http://www.cnblogs.com/wycg1984/archive/2009/09/16/1567605

相关问答

更多
  • 你也可以检查下面: - SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching 在-七致命-罪-OF-的Solr You can also check below :- SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching the-seven-deadly-sins-of-solr
  • 这主要是Nutch使用的Solrj版本罐和您尝试集成的Solr 3.6之间的javabin不兼容性。 您需要更新Solrj罐并重新生成作业。 按照论坛中提到的步骤操作。 This is mainly the javabin incompatiblity between the Solrj version jars used by Nutch and the Solr 3.6 which you are trying to integrate. You would need to update the Sol ...
  • 正如您正确地发现这些是Solr 5.x特定功能和DSE 4.8随Solr 4.10.x一起提供。 当DSE更新时,您将能够使用这些新的Solr 5.x功能。 As you rightly found out these are Solr 5.x specific features and DSE 4.8 comes with Solr 4.10.x. You will be able to use these new Solr 5.x features when DSE gets updated.
  • ((important: true AND (date:2016* OR date:2015*))^1001 OR (important: false AND (date:2016* OR date:2015*))^1000 OR date:*) AND something:"foo"并排序score desc, date desc 这将首先显示最近的重要项目,然后是最近的非重要项目,最后是所有项目,以及按“日期”在“部分”中排序的所有内容。 something:"foo"条款末尾的something:"f ...
  • MatsLindh对导出请求处理程序的建议工作完美。 如果它不在那里,请将此requestHandler添加到您的solrconfig {!xport} xsort fals ...
  • 尝试使用olr.WordDelimiterFilterFactory 测试用例:
    您需要将以下Apache Commons库添加到类路径中: commons-httpclient.jar (您可以将它放在nutch安装所使用的其他JAR所在的文件夹中)。 你可以在这里找到当前版本的HttpClient http://hc.apache.org/httpcomponents-client-ga/ 请注意,您的Nutch版本可能使用较旧版本的HttpClient,而当前版本的HttpClient与旧版本不兼容。 在这种情况下,您需要下载旧版本的HttpClient,并在您的库中包含旧版本。 ...
  • Solr核心本质上是在应用程序服务器的相同上下文中运行的多个索引。 你可以认为它为每个用户安装了1个war文件 。 每个核心都以名称分隔,因此您必须自己跟踪哪个网址对哪个用户有效。 例如, http://host.com/solr/usercore1/select?q=test http://host.com/solr/usercore2/select?q=test 它基于config solr.xml :
  • 尝试这个 http://localhost:8887/solr/souro_core2/select?q=name:souro&indent=true&shards=shard1,shard2 这应该工作如果你有收藏名称souro_core2有两个分片。 Finally i got my answer. In both shards there was an "id" field and both were containing value 1. But after doing bit research ...
  • 嗯好吃 首先,对于所有这些问题,使用Solr分析工具是你的朋友。 其次,请记住,如果查询和术语是字符相同的100%字符,则Solr仅匹配。 对于以下过滤器