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.....



原创粉丝点击