Solr Analysis And Solr Query -- Solr分析以及查询
来源:互联网 发布:u盘 恢复数据.电脑 编辑:程序博客网 时间:2024/06/01 10:13
在使用Solr中文分词器IkAnalizer时,查询时并不会对搜索语句进行切分词。比如搜索:华为手机,得到的结果只包含与“华为手机”完全匹配的Document,而标题,或者Tag包含"华为"或"手机"的Document并没有被搜索出来。基于这个原因,进行搜索时,需要先对搜索语句进行分词,组装最终搜索语句,然后进行搜索。
1.使用IKAnalyzer来对中文进行分析
<!-- for searching Chinese words -->
<fieldType name="text_chinese" class="solr.TextField" >
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer">
</analyzer>
</fieldType>
2.应用此类型于相关属性
<!--其他域在此省略..... -->
<field name="product_name" type="text_chinese" indexed="true" stored="true" multiValued="false" /> <!-- 包含中文的产品名 -->
<field name="product_tags" type="text_chinese" indexed="true" stored="true" /><!-- 包含中文的产品标签 -->
3.对查询语句进行分析(应用text_chinese类型进行分词)
public String analysisBeforeQuery(String queryTerm)
{
String nextQuery = "";
SolrQuery query = new SolrQuery();
query.add(CommonParams.QT, "/analysis/field"); // query type
query.add(AnalysisParams.FIELD_VALUE, queryTerm);
query.add(AnalysisParams.FIELD_TYPE, "text_chinese");
//query.add(AnalysisParams.FIELD_NAME, "product_name");
try
{
/* solr使用text_chinese进行分析的结果
* {responseHeader={status=0,QTime=1},analysis={field_types={text_chinese={index={org.wltea.analyzer.lucene.IKTokenizer=[{text=华为,raw_bytes=[e5 8d 8e e4 b8 ba],start=0,end=2,type=CN_WORD,position=1,positionHistory=[1]}, {text=手机,raw_bytes=[e6 89 8b e6 9c ba],start=2,end=4,type=CN_WORD,position=2,positionHistory=[2]}, {text=手,raw_bytes=[e6 89 8b],start=2,end=3,type=CN_WORD,position=3,positionHistory=[3]}, {text=机,raw_bytes=[e6 9c ba],start=3,end=4,type=CN_CHAR,position=4,positionHistory=[4]}]}}},field_names={}}}
*/
//对响应进行解析
NamedList<Object> analysis = (NamedList<Object>) response.getResponse().get("analysis");// analysis node
NamedList<Object> field_types = (NamedList<Object>) analysis.get("field_types");// field_types node
NamedList<Object> text_chinese = (NamedList<Object>) field_types.get("text_chinese");// text_chinese node
NamedList<Object> index = (NamedList<Object>) text_chinese.get("index");// index node
List<SimpleOrderedMap<String>> list = (ArrayList<SimpleOrderedMap<String>>) index.get("org.wltea.analyzer.lucene.IKTokenizer");// tokenizer node
// 在每个词条中间加上空格,为每个词条进行或运算
for(Iterator<SimpleOrderedMap<String>> iter = list.iterator(); iter.hasNext();)
{
nextQuery += iter.next().get("text") + " ";
}
}
catch (SolrServerException e)
{
e.printStackTrace();
}
return nextQuery.trim(); // 去掉最后一个空格并返回组装的字符串
}
4.进行最终查找
public void queryDocuments(String queryTerm)
{
String query_term = analysisBeforeQuery(queryTerm);
SolrQuery solrQuery = new SolrQuery(query_term);
solrQuery.add("defType", "dismax");
solrQuery.add("qf", "product_name product_tags^10");
solrQuery.add("fl", "*");
try
{
QueryResponse queryResponse = solrServer.query(solrQuery);
for(SolrDocument doc : queryResponse.getResults())
{
// 执行操作
//.....
}}
catch (SolrServerException e)
{
e.printStackTrace();
}
}
这里,省略了SolrServer的生命:private static HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/product/");
至此,我们可以搜索到期望的结果了.....
Next Blog, Readers.....
- Solr Analysis And Solr Query -- Solr分析以及查询
- solr查询语法(solr query)
- solr query
- solr Query
- solr Query
- Solr --- Query
- solr 或查询 or query
- Solr
- solr
- solr
- solr
- solr
- solr
- Solr
- solr
- solr
- solr
- solr
- java设计模式学习一
- 孙鑫掌握C++20130507
- (4)数组
- (5)面向对象,封装&this关键字
- C语言实现二叉树的递归遍历与非递归遍历
- Solr Analysis And Solr Query -- Solr分析以及查询
- Shell进制转换小结
- (6)面向对象静态&单例
- HDU 1879 继续畅通工程
- C++虚函数的作用
- 常量指针与指针常量的区别
- (7)面向对象继承&抽象类&接口
- ACM 知识点分类
- jsp过滤器filter