利用SOLR搭建企业搜索平台 之八(solr 实现去掉重复的搜索结果,打SOLR-236_collapsing.patch补丁)

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

引用Bory.Chan http://blog.chenlb.com/2009/04/apply-solr-collapsing-patch-remove-duplicate-result.html
打上SOLR-236_collapsing.patch补丁,实现 solr 搜索结果折叠、除去重复的搜索结果,可以实现类似google搜索结果的“站内的其它相关信息 ”。solr collapsing patch 是用 hash 某个字段来实现折叠重复结果的。下面我演示下应用这个补丁并搜索试用下。

其实 solr 上已经有了这功能的实现:solr 1.3 collapse patch, 请看: https://issues.apache.org/jira/browse/SOLR-236,我这里下载是了新的: https://issues.apache.org/jira/secure/attachment/12403590/SOLR-236_collapsing.patch

下载好后就需要打上补丁了,先准备一份源码在D:/apache-solr-1.3.0目录下。没有可以去下载:http: //archive.apache.org/dist/lucene/solr/1.3.0/apache-solr-1.3.0.zip。把SOLR- 236_collapsing.patch文件放在D:/apache-solr-1.3.0目录下, 打补丁有我知道的有两种:用linux工具 patch(windows 下有 cygwin);用 ant 的 patch。

windows cygwin 的 patch:
Html代码
  1. D:\apache-solr-1.3.0>patch -p0 < SOLR-236_collapsing.patch  
  2. patching file src/test/org/apache/solr/search/TestDocSet.java  
  3. patching file src/java/org/apache/solr/search/CollapseFilter.java  
  4. patching file src/java/org/apache/solr/search/DocSet.java  
  5. patching file src/java/org/apache/solr/search/NegatedDocSet.java  
  6. patching file src/java/org/apache/solr/search/SolrIndexSearcher.java  
  7. patching file src/java/org/apache/solr/common/params/CollapseParams.java  
  8. patching file src/java/org/apache/solr/handler/component/CollapseComponent.java 
ant patch,把下面的内容保存为 patch-build.xml 放到 D:\apache-solr-1.3.0 目录下:

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <project name="solr-patch" default="apply-patch" basedir=".">      
  3.     
  4.     <target name="apply-patch" description="Apply a patch file.  Set -Dpatch.file">    
  5.         <patch patchfile="${patch.file}" strip="0"/>    
  6.     </target>    
  7. </project>  
 
ant 打补丁:
Html代码
  1. D:\apache-solr-1.3.0>ant -Dpatch.file=SOLR-236_collapsing.patch -f patch-build.xml  
  2. Buildfile: patch-build.xml  
  3.   
  4. apply-patch:  
  5. [patch] patching file src/test/org/apache/solr/search/TestDocSet.java  
  6. [patch] patching file src/java/org/apache/solr/search/CollapseFilter.java  
  7. [patch] patching file src/java/org/apache/solr/search/DocSet.java  
  8. [patch] patching file src/java/org/apache/solr/search/NegatedDocSet.java  
  9. [patch] patching file src/java/org/apache/solr/search/SolrIndexSearcher.java  
  10. [patch] patching file src/java/org/apache/solr/common/params/CollapseParams.java  
  11. [patch] patching file src/java/org/apache/solr/handler/component/CollapseComponent.java  
  12.   
  13. BUILD SUCCESSFUL  
  14. Total time: 0 seconds 
源码打上了补丁,然后用 ant 构建源码:

D:\apache-solr-1.3.0>ant dist

在 D:/apache-solr-1.3.0/dist 目录下可以找到编译好的 solr 了。然后把 solr 放到 tomcat 中去运行它,把下面的内容保存在 TOMCAT_HOME/conf/Catalina/localhost/solr.xml 文件中:

Xml代码
  1. <Context docBase="D:\apache-solr-1.3.0\dist\apache-solr-1.3.0.war" reloadable="true" >    
  2.     <Environment name="solr/home" type="java.lang.String" value="D:\apache-solr-1.3.0\example\solr" override="true" />    
  3. </Context>    


修改 D:\apache-solr-1.3.0\example\solr\conf\solrconfig.xml 使 solr 可以支持 collapse。

定义搜索组件,在 QueryComponent 附近:

<searchComponent name="collapse" class="org.apache.solr.handler.component.CollapseComponent" /> 
定义一个 handler 使用上面的搜索组件:
Xml代码
  1. <requestHandler name="collapse" class="solr.SearchHandler">    
  2.   <!-- default values for query parameters -->    
  3.    <lst name="defaults">    
  4.      <str name="echoParams">explicit</str>    
  5.    </lst>    
  6.   <arr name="components">    
  7.     <str>collapse</str>    
  8.     <str>debug</str>    
  9.   </arr>    
  10. </requestHandler>  
安装启动 tomcat,现在提交一些数据给它,用官方的示例数据就可以了。运行:
Html代码
  1. D:\apache-solr-1.3.0\example\exampledocs>java -Durl=http://localhost:8080/solr/update -Dcommit=yes -jar post.jar *.xml  
  2. SimplePostTool: version 1.2  
  3. SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8, other encodings are not currently supported  
  4. SimplePostTool: POSTing files to http://localhost:8080/solr/update..  
  5. SimplePostTool: POSTing file hd.xml  
  6. SimplePostTool: POSTing file ipod_other.xml  
  7. SimplePostTool: POSTing file ipod_video.xml  
  8. SimplePostTool: POSTing file mem.xml  
  9. SimplePostTool: POSTing file monitor.xml  
  10. SimplePostTool: POSTing file monitor2.xml  
  11. SimplePostTool: POSTing file mp500.xml  
  12. SimplePostTool: POSTing file sd500.xml  
  13. SimplePostTool: POSTing file solr.xml  
  14. SimplePostTool: POSTing file spellchecker.xml  
  15. SimplePostTool: POSTing file utf8-example.xml  
  16. SimplePostTool: POSTing file vidcard.xml  
  17. SimplePostTool: COMMITting Solr index changes.. 
http://localhost:8080/solr/admin/stats.jsp 有结果了? 有了。然后开始查询试试看。

查询:http://localhost:8080/solr/select/?q=*%3A*&indent=on& qt=collapse&collapse=true&collapse.field=popularity&collapse.threshold=1

结果:
Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <response>    
  3.     
  4. <lst name="responseHeader">    
  5.  <int name="status">0</int>    
  6.  <int name="QTime">0</int>    
  7.  <lst name="params">    
  8.   <str name="collapse.field">popularity</str>    
  9.   <str name="fl">id</str>    
  10.   <str name="collapse.threshold">1</str>    
  11.   <str name="indent">on</str>    
  12.   <str name="q">*:*</str>    
  13.   <str name="qt">collapse</str>    
  14.   <str name="collapse">true</str>    
  15.  </lst>    
  16. </lst>    
  17. <lst name="collapse_counts">    
  18.  <str name="field">popularity</str>    
  19.  <lst name="doc">    
  20.   <int name="SP2514N">4</int>    
  21.   <int name="F8V7067-APL-KIT">1</int>    
  22.   <int name="MA147LL/A">1</int>    
  23.   <int name="TWINX2048-3200PRO">1</int>    
  24.   <int name="VS1GB400C3">3</int>    
  25.   <int name="1">10</int>    
  26.  </lst>    
  27.  <lst name="count">    
  28.   <int name="6">4</int>    
  29.   <int name="1">1</int>    
  30.   <int name="10">1</int>    
  31.   <int name="5">1</int>    
  32.   <int name="7">3</int>    
  33.   <int name="0">10</int>    
  34.  </lst>    
  35.  <str name="debug">HashDocSet(6) Time(ms): 0/0/0/0</str>    
  36. </lst>    
  37. <result name="response" numFound="6" start="0">    
  38.  <doc>    
  39.   <str name="id">SP2514N</str>    
  40.  </doc>    
  41.  <doc>    
  42.   <str name="id">F8V7067-APL-KIT</str>    
  43.  </doc>    
  44.  <doc>    
  45.   <str name="id">MA147LL/A</str>    
  46.  </doc>    
  47.  <doc>    
  48.   <str name="id">TWINX2048-3200PRO</str>    
  49.  </doc>    
  50.  <doc>    
  51.   <str name="id">VS1GB400C3</str>    
  52.  </doc>    
  53.  <doc>    
  54.   <str name="id">1</str>    
  55.  </doc>    
  56. </result>    
  57. </response>    
  58. 可以看到 collapse_counts 相关的输出:  
  59.   
  60. <lst name="collapse_counts">    
  61.  <str name="field">popularity</str>    
  62.  <lst name="doc">    
  63.   <int name="SP2514N">4</int>    
  64. ...    
  65.  </lst>    
  66.  <lst name="count">    
  67.   <int name="6">4</int>    
  68.   <int name="1">1</int>    
  69.   <int name="10">1</int>    
  70.   <int name="5">1</int>    
  71.   <int name="7">3</int>    
  72.   <int name="0">10</int>    
  73.  </lst>    
  74.  <str name="debug">HashDocSet(6) Time(ms): 0/0/0/0</str>    
  75. </lst>   
上面的 count 下的内容(它的顺序是result/doc的顺序),表示 popularity=6 相同的结果还有 4 个,与 popularity=1 相同的结果还有 1 个,依此类推。这样就可以显示给用户的界面里提示“相同的其它内容不有N个”。

使用的参数有:

#启用 collapse 组件 
collapse=true 
#用那个字段来 hash 去除重量内容 
collapse.field=popularity 
#要结果中可以最多出现几个相同的文档 
collapse.threshold=1 
当然还有其它参数,请看:org.apache.solr.common.params.CollapseParams 类。
转自:http://www.cnblogs.com/wycg1984/archive/2009/09/16/1567614

相关问答

更多

Solr MultiCore搜索(Solr MultiCore Search)

Solr核心本质上是在应用程序服务器的相同上下文中运行的多个索引。 你可以认为它为每个用户安装了1个war文件 。 每个核心都以名称分隔,因此您必须自己跟踪哪个网址对哪个用户有效。 例如, http://host.com/solr/usercore1/select?q=test http://host.com/solr/usercore2/select?q=test 它基于config solr.xml : <solr persistent="true" sharedLib="lib"> <c

加快SOLR搜索(Speeding up SOLR search)

你也可以检查下面: - SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching 在-七致命-罪-OF-的Solr You can also check below :- SolrPerformanceFactors ImproveSearchingSpeed ImproveIndexingSpeed SolrCaching the-seven-deadly-sins-of-solr

在主模板的编辑器中如何使solr搜索对象?(How to make object of solr search in editor of main template?)

您需要使用基本的Solr TypoScript。 You need to use the basic Solr TypoScript.

Apache solr搜索问题(Apache solr search issue)

嗯好吃 首先,对于所有这些问题,使用Solr分析工具是你的朋友。 其次,请记住,如果查询和术语是字符相同的100%字符,则Solr仅匹配。 对于以下过滤器 <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" pr

Solr搜索使用包含,声音就像(Solr search using contains, sound like)

搜索包含显然可以使用通配符(例如: title:*aaa*将匹配'aaabbb'和'cccaaabbb'),但要小心,因为它不会有效地使用索引。 你真的需要这个吗? 类似于搜索的索引可以将solr.PhoneticFilterFactory过滤器应用于索引和查询。 为了实现这个,在schema中像这样定义你的fieldType: <fieldType name="text_soundex" class="solr.TextField"> ... <filter class="solr.Phone

相关文章

更多

最近更新

更多