浏览 13811 次
锁定老帖子 主题:solr技术文档
精华帖 (2) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-09
1. 了解lucene 原理,全文搜索概念,参考(http://wishlife.iteye.com/category/30179) .建立自己的索引库. 2. 了解solr参考(http://www.ibm.com/developerworks/cn/java/j-solr1/, http://www.ibm.com/developerworks/cn/java/j-solr2/).并下载实例程序. 3. 搭建SOLR服务器 3.1 官方下载 apache-solr-1.3.0.zip 和tomcat5.5 3.2 将apache-solr-1.3.0\example\webapps\solr.war部署有 tomcat 下 3.3 设置 solr 环境变量 apache-tomcat-5.5.26\conf\Catalina\localhost\下新建solr.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <Context docBase="" debug="0" crossContext="true" > <Environment name="solr/home" type="java.lang.String" value="e:/tomcat/solr" override="true" /> </Context>设置e:/tomcat/solr为solr主目录 ,建立文件夹. 3.4 将apache-solr-1.3.0\example\solr 下所有文件复制到e:/tomcat/solr下 3.5 启动 tomcat -> 浏览http://localhost:8080/solr/admin/ 能访问Solr Admin 页面说明Solr 服务器设置成功. 4. 为Solr 创建索引库 4.1 在 e:/tomcat/solr 目录下新建名为data 的文件夹,再在data 下新建index名为 文件夹 4.2 将lucene 创建好的索引放入e:/tomcat/solr/data/index 下 5. Solr 索引设置 5.1 在e:/tomcat/solr /conf 下solrconfig.xml, schema.xml <2>中的技术文档有详细说明 5.2 中文支持,如果你的索引要支持中文搜索的话,在此推荐庖丁分词,参考(http://www.iteye.com/topic/110148) schema.xml 设置如下: 中文词组分词 <fieldtype name="text" class="solr.TextField" positionIncrementGap="100"> 创建索引时 <analyzer type="index"> <tokenizer class="com.chuangs.fulltextsearch.analyzer.ChineseTokenizerFactory" mode="most-words"/> </analyzer> 搜索时 <analyzer type="query"> <tokenizer class="com.chuangs.fulltextsearch.analyzer.ChineseTokenizerFactory" mode="most-words"/> </analyzer> </fieldtype> 中文单词分词 <fieldtype name="word" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="org.apache.solr.analysis.StandardTokenizerFactory"/> </analyzer> </fieldtype> 相关搜索field设置 词组 <field name="XXXX " type="text" indexed="true" stored="true" multiValued="true" omitNorms="true"/> 单词 <field name=" XXXX Word" type="word" indexed="true" stored="true" multiValued="true" omitNorms="true"/>注: com.fulltextsearch.analyzer.ChineseTokenizerFactory 是用solr 封装的庖丁分词,如下: import java.io.Reader; import java.util.Map; import net.paoding.analysis.analyzer.PaodingTokenizer; import net.paoding.analysis.analyzer.TokenCollector; import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector; import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector; import net.paoding.analysis.knife.PaodingMaker; import org.apache.lucene.analysis.TokenStream; import org.apache.solr.analysis.BaseTokenizerFactory; public class ChineseTokenizerFactory extends BaseTokenizerFactory { /** * 最多切分 默认模式 */ public static final String MOST_WORDS_MODE = "most-words"; /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = "max-word-length"; private String mode = null; public void setMode(String mode) { if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) { this.mode = MOST_WORDS_MODE; } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) { this.mode = MAX_WORD_LENGTH_MODE; } else { throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode); } } @Override public void init(Map args) { super.init(args); setMode(args.get("mode").toString()); } public TokenStream create(Reader input) { return new PaodingTokenizer(input, PaodingMaker.make(), createTokenCollector()); } private TokenCollector createTokenCollector() { if (MOST_WORDS_MODE.equals(mode)) return new MostWordsTokenCollector(); if (MAX_WORD_LENGTH_MODE.equals(mode)) return new MaxWordLengthTokenCollector(); throw new Error("never happened"); } }6 .Solr 搜索 6.1 相关url 介绍 http://localhost:8080/solr/ select/ 查询索引路径 http://localhost:8080/solr/update/ 查询更新路径 6.2 查询参数介绍 fl=*,score&q.op=AND&start=0&rows=16&hl=true&hl.fl=merHeading&hl.snippets=3&hl.simple.pre=<font color=red>&hl.simple.post=</font>&facet=true&facet.field=merCategory&q=+(merHeading%3A%E4%BD%A0%E5%A5%BD+AND+merHeadingWithWord%3A%E6%BD%98 ) +merActualendTime:[1239264030468 TO 1240473630468]&sort=merActualendTime ascfl表示索引显示那些field(*表示所有field, score 是solr 的一个匹配热度) q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或) start 开始返回条数 rows 返回多少条 hl 是否高亮 hl.fl 高亮field hl.snippets 不太清楚(反正是设置高亮3就可以了) hl.simple.pre 高亮前面的格式 hl.simple.post 高亮后面的格式 facet 是否启动统计 facet.field 统计field q 查询语句(类似SQL) 相关详细的操作还需lucene 的query 语法 sort 排序 6.3中文搜索 中文搜索时必须要将中文URLEncoder.encode 用UTF-8, tomcat 还需设置URIEncoding="UTF-8" ,用GET方式发送请求. 如:merHeading%3A%E4%BD%A0%E5%A5%BD+AND+merHeadingWithWord%3A%E6%BD%98 我是要搜索 “你好 潘” 因为庖丁分词没有单词分词,当搜索中有单词是还需要使用另外的field ,所以在程序中要分解“你好 潘”成” 你好””潘”,然后”你好”用merHeading搜索, ”潘”用merHeadingWithWord搜索再取他们的并集(AND操作) 7. Solr相关命令 7.1 新建和更新 <add> <doc><field name="id">1</field><field name="merHeading">你好潘修艳</field> <field name="merHeadingWithWord">你好潘修艳</field> </doc> <doc> <field name="id">2</field><field name="merHeading">你好潘修艳1</field> <field name="merHeadingWithWord">你好潘修艳1</field> </doc> </add>新建和更新的文档格式一样,注 field有”&”字符用”&”替换. 发送到 http://localhost:8080/solr/update/ 用POST方式 7.2 删除 <delete><id>1</id><id>2</id> 发送到 http://localhost:8080/solr/update/ 用POST方式 7.3 提交 以上操作如果需要生效的需要提交命令 <commit/> 发送到 http://localhost:8080/solr/update/ 用POST方式 7.4 优化索引库 <optimize/> 发送到 http://localhost:8080/solr/update/ 用POST方式 8. 总结 以上是个人项目开发时的技术总结,如有错误请指出,与大家一齐分享成果是一件很开心的事. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-03
最后修改:2009-06-03
“7. Solr相关命令”这节“发送到 http://localhost:8080/solr/update/ 用POST方式”,命令怎么执行?看不懂
|
|
返回顶楼 | |
发表时间:2009-06-04
ganqing1234 写道 “7. Solr相关命令”这节“发送到 http://localhost:8080/solr/update/ 用POST方式”,命令怎么执行?看不懂
利用apahce HttpClient包可以啊. 详细请见API |
|
返回顶楼 | |
发表时间:2009-06-22
为什么我 更新index,并 commit后 index目录里的文件有所变化(多了好几个文件出来) 但是查询结果却没有任何变化?
|
|
返回顶楼 | |
发表时间:2009-06-22
joujou 写道 为什么我 更新index,并 commit后 index目录里的文件有所变化(多了好几个文件出来) 但是查询结果却没有任何变化?
会不会是延时问题了,确认提交成功和更新成功了吗.有时还有缓存的问题. 最后直接用Lucene 本地查询一下! |
|
返回顶楼 | |
发表时间:2009-06-22
谢谢回复。用lucene 查询时 说找不到指定文件 segments, index目录下有segments.gen 和 segments_1 这俩文件。
更新和提交都已成功。 返回结果 <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"><int name="status">0</int><int name="QTime">547</int></lst> </response> 如果是延迟或者缓存问题 应该如何解决? |
|
返回顶楼 | |
发表时间:2009-06-22
joujou 写道 谢谢回复。用lucene 查询时 说找不到指定文件 segments, index目录下有segments.gen 和 segments_1 这俩文件。
更新和提交都已成功。 返回结果 <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"><int name="status">0</int><int name="QTime">547</int></lst> </response> 如果是延迟或者缓存问题 应该如何解决? 延迟 :等待 缓存 :使用不同的条件去查询,或重启solr server. 认真检查程序,经常一些错误是因为我们的程序有一些不起眼错误引起的. 优化一下solr 索引库再去 lucene 查询一下. |
|
返回顶楼 | |
发表时间:2009-06-22
优化完了后 还是只有_2.xxx...文件 和segments.gen 和 segments_N 这两个文件。。。在 _2.fdt 文件中有新加入的信息, 但是还是查不出来。。。简直都无奈了。。
|
|
返回顶楼 | |
发表时间:2009-11-05
joujou 写道 谢谢回复。用lucene 查询时 说找不到指定文件 segments, index目录下有segments.gen 和 segments_1 这俩文件。
更新和提交都已成功。 返回结果 <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"><int name="status">0</int><int name="QTime">547</int></lst> </response> 如果是延迟或者缓存问题 应该如何解决? 可能没有提交commit命令 |
|
返回顶楼 | |