【Lucene3.6.2入门系列】第15节_SolrJ高亮

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

package com.jadyer.solrj;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument;

/**
 * 【Lucene3.6.2入门系列】第15节_SolrJ高亮
 * @create Aug 20, 2013 1:50:38 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public enum HelloSolrJHighLighter {
	INSTANCE;
	
	private SolrServer server;
	
	private HelloSolrJHighLighter(){
		//创建SolrServer对象,它有两个线程安全的子类EmbeddedSolrServer和CommonsHttpSolrServer
		//EmbeddedSolrServer-----内嵌式的,不需要启动Web服务器
		//CommonsHttpSolrServer--需要启动Web服务器,它是通过HTTP请求来获取数据的
		//CommonsHttpSolrServer已不推荐直接使用了,而是推荐使用HttpSolrServer类
		//同样的StreamingUpdateSolrServer也不推荐使用了,推荐使用ConcurrentUpdateSolrServer
		server = new HttpSolrServer("http://127.0.0.1:8088/solr");
		//添加索引
		this.addIndex();
	}
	

	/**
	 * 添加索引
	 * @see 这里之所以没有硬编码指定my_title和my_content的中文分词器
	 * @see 是由于schema.xml中在定义这俩<field>时已通过type属性指定了中文分词器
	 * @see 关于指定中文分词器的具体方法,详见http://blog.csdn.net/jadyer/article/details/10106011
	 */
	private void addIndex(){
		try {
			//添加之前先删除全部索引,删除完记得commit才能生效
			server.deleteByQuery("*:*");
			server.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
		List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
		for(int i=1; i<4; i++){
			SolrInputDocument doc = new SolrInputDocument();
			//对于Solr而言,默认的id是唯一的主键(如果我们没有自定义主键的话),当多次添加的时候,最后添加的相同id的域会覆盖已有的
			doc.addField("id", Integer.toString(i));
			//这里使用的是自定义的Field,所以就需要在schema.xml中为其添加<field>描述,并通过type属性指定其使用的分词器
			doc.addField("my_title", "这是我的第" + i + "个SolrJ程序");
			doc.addField("my_content", "my第" + i + "个SolrJ程序的运行情况");
			docs.add(doc);
		}
		try {
			//可以只添加一个Document,也可以一次添加多个Document,这里添加多个
			server.add(docs);
			//commit后方能生效,否则搜索到的还是add前的索引信息
			server.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 搜索高亮
	 */
	public void testHighLighter(){
		SolrQuery query = new SolrQuery("my_title:SolrJ");
		query.setHighlight(true).setHighlightSimplePre("<span style='color:red'>").setHighlightSimplePost("</span>");
		//设置高亮的区域,可设置多个区域(但有个前提-->待高亮的信息必须是被存储的,即schema.xml中配置<field store="true">)
		query.setParam("hl.fl", "my_title, my_content");
		QueryResponse resp = null;
		try {
			resp = server.query(query);
		} catch (SolrServerException e) {
			e.printStackTrace();
		}
		for(SolrDocument sd : resp.getResults()){
			Map<String, List<String>> snippetMap = resp.getHighlighting().get(sd.getFieldValue("id"));
			if(snippetMap!=null && !snippetMap.isEmpty()){
				List<String> snippetList = snippetMap.get("my_title");
				for(String snippet : snippetList){
					System.out.print(snippet);
				}
				System.out.print("        ");
				//注意,如果在配置<field my_content multiValued="true"/>时指定其支持多值域
				//那么,此处获取到的就会是第一个值域的值
				snippetList = snippetMap.get("my_content");
				for(String snippet : snippetList){
					System.out.println(snippet);
				}
			}
		}
	}
	
	
	/**
	 * 测试一下SolrJ的高亮效果
	 * @see 测试前记得启动Web服务器
	 * @see 关于Solr与Tomcat的整合,详见http://blog.csdn.net/jadyer/article/details/10104077
	 */
	public static void main(String[] args) {
		HelloSolrJHighLighter.INSTANCE.testHighLighter();
	}
}

转自:http://www.cnblogs.com/keanuyaoo/p/3271430

相关问答

更多
  • http://blog.163.com/bestcs@126/blog/static/4619987720111029103037612/ 到这里下载arm嵌入式系统相关教程书籍
  • Painter从入门到精通系列教学视频教程 http://www.shouhui119.com/shouhuishipinjiaocheng/shouhuiruanjian/137.html
  • lucene 使用步骤[2022-10-07]

    lucene主要完成的是Indexing&Search功能,所以一般使用步骤: 建索引、优化索引 和搜索
  • lucene怎么用[2022-07-03]

    Lucene是一个全文检索系统框架,开源的。 用起来比较方便,去Lucene的官网上下一个包并导入到你的工程中就可以调用包里面的类了。 一般的书里面介绍的版本都是1.4.3或者稍微高级一点的,不过现在lucene3.0正式发布,一些函数调用方法已经改变了,你可以下载一个版本低一点的Lucene比较适合学习~ 当然你直接从3.0入手的话网上资料也是非常丰富的~
  • 这不是很简单的问题?把HTML目录设置成lucene的索引目录,再用程序读出HTML文件代码,再索引HTML文件内容
  • 由于RealTime Get是使用备用requestHandler实现的,因此您只需要在SolrQuery上使用setRequestHandler()方法,将"/get"作为处理程序名称。 有关完整示例,请参阅Solr源中此SolrExampleTests.java文件中的testRealTimeGet()方法。 这是该文件的片段: SolrQuery q = new SolrQuery(); q.setRequestHandler("/get"); q.set("id", "DOCID"); ...
  • 范围查询(比如0到100)是范围内所有术语(1,2,3,4,5 ...)的列表的联合。 问题是,如果范围必须访问很多条款,因为它意味着处理许多短期名单。 最好只处理几个长列表(这是lucene优化的)。 所以当你使用一个数字字段并且索引一个数字时(比如4),我们实际上会多次重复索引它,以较低的精度添加一些“假词”。 这允许我们通过处理7个项而不是100来处理范围如0到100:“0-63”,“64-95”,96,97,98,99,100。在这个例子中,“0-63 “和”64-95“是代表范围值的附加冗余项。 ...
  • import org.apache.solr.client.solrj.impl.CloudSolrServer; import org.apache.solr.common.SolrInputDocument; CloudSolrServer server = new CloudSolrServer("localhost:9983"); server.setDefaultCollection("collection1"); SolrInputDocument doc = new SolrInputDoc ...
  • 最后我得到了它的工作: public final class StandardAnalyzerV36 extends Analyzer { public static final CharArraySet STOP_WORDS_SET = StopAnalyzer.ENGLISH_STOP_WORDS_SET; @Override protected TokenStreamComponents createComponents(String fieldName) { ...
  • 您需要在之后添加{...}以使其循环。 否则它的循环只有第一行m = (int) (1.151 * knot); 循环结束后将执行其余的行。 for (knot = 15; knot < 30; ++knot) { m = (int) (1.151 * knot); k = (int) (1.852 * knot); v = knot; System.out.println(v + " knots is " + m + " miles and " + k + " kilom ...