Apache Solr初体验四

前几次我们讲到了solr的基本用法和配置文件,接下来就开始进入我们真正的代码之旅啦。

1)首先以一个简单的程序来开头:

Java代码   收藏代码
  1. public static void main(String[] args) throws SolrServerException, IOException, ParserConfigurationException, SAXException{  
  2.         
  3.           //设置solr.home,注意这时通过环境变量是solr.solr.home  
  4.       System.setProperty("solr.solr.home","E:\\solr");  
  5.           //初始化容器,让它加载solr.home的配置文件  
  6.       CoreContainer.Initializer initializer = new CoreContainer.Initializer();  
  7.       CoreContainer coreContainer = initializer.initialize();  
  8.         
  9.       EmbeddedSolrServer solrServer = new EmbeddedSolrServer(coreContainer,"");  
  10.       //构造参数列表  
  11.       SolrQuery solrQuery = new SolrQuery();   
  12.       Map<String,String> map = new HashMap<String,String>();  
  13.       map.put(FacetParams.FACET_DATE, "manufacturedate_dt");  
  14.       map.put(FacetParams.FACET_DATE_START,"2004-01-01T00:00:00Z");  
  15.       map.put(FacetParams.FACET_DATE_END,"2010-01-01T00:00:00Z");  
  16.       map.put(FacetParams.FACET_DATE_GAP,"+1YEAR");  
  17.       map.put("indent","on");  
  18.       map.put("wt","xml");  
  19.       map.put("hl.fl","name");  
  20.       SolrParams params = new MapSolrParams(map);  
  21.       solrQuery.add(params);  
  22.       solrQuery.setFacet(true);  
  23.       solrQuery.setFields("name,price,score");  
  24.       solrQuery.setQuery("solr");  
  25.       solrQuery.setSortField("price",SolrQuery.ORDER.asc);  
  26.       solrQuery.setHighlight(true);  
  27.         
  28.       System.out.println(solrQuery.toString());  
  29.             
  30.       QueryResponse queryResponse = solrServer.query(solrQuery);   
  31.       System.out.println(queryResponse.toString());  
  32.       System.out.println("共找到:"+queryResponse.getResults().getNumFound()+"个结果");  
  33.           //解析返回的参数  
  34.       SolrDocumentList sdl = (SolrDocumentList)queryResponse.getResponse().get("response");  
  35.       for (int i = 0; i< sdl.size(); i++){  
  36.           Object obj = sdl.get(i).get("manufacturedate_dt");  
  37.           String date = "";  
  38.           if (obj!= null){  
  39.               date = new SimpleDateFormat("yyyy-MM-dd").format((Date)obj);  
  40.           }  
  41.             
  42.           System.out.println(((SolrDocument)sdl.get(i)).get("name")+":"+date+":"+(sdl.get(i).get("price")));  
  43.       }  
  44.   }  
public static void main(String[] args) throws SolrServerException, IOException, ParserConfigurationException, SAXException{
	  
          //设置solr.home,注意这时通过环境变量是solr.solr.home
	  System.setProperty("solr.solr.home","E:\\solr");
          //初始化容器,让它加载solr.home的配置文件
	  CoreContainer.Initializer initializer = new CoreContainer.Initializer();
	  CoreContainer coreContainer = initializer.initialize();
	  
	  EmbeddedSolrServer solrServer = new EmbeddedSolrServer(coreContainer,"");
	  //构造参数列表
	  SolrQuery solrQuery = new SolrQuery(); 
	  Map<String,String> map = new HashMap<String,String>();
	  map.put(FacetParams.FACET_DATE, "manufacturedate_dt");
	  map.put(FacetParams.FACET_DATE_START,"2004-01-01T00:00:00Z");
	  map.put(FacetParams.FACET_DATE_END,"2010-01-01T00:00:00Z");
	  map.put(FacetParams.FACET_DATE_GAP,"+1YEAR");
	  map.put("indent","on");
	  map.put("wt","xml");
	  map.put("hl.fl","name");
	  SolrParams params = new MapSolrParams(map);
	  solrQuery.add(params);
	  solrQuery.setFacet(true);
	  solrQuery.setFields("name,price,score");
	  solrQuery.setQuery("solr");
	  solrQuery.setSortField("price",SolrQuery.ORDER.asc);
	  solrQuery.setHighlight(true);
	  
	  System.out.println(solrQuery.toString());
          
	  QueryResponse queryResponse = solrServer.query(solrQuery); 
	  System.out.println(queryResponse.toString());
	  System.out.println("共找到:"+queryResponse.getResults().getNumFound()+"个结果");
          //解析返回的参数
	  SolrDocumentList sdl = (SolrDocumentList)queryResponse.getResponse().get("response");
	  for (int i = 0; i< sdl.size(); i++){
		  Object obj = sdl.get(i).get("manufacturedate_dt");
		  String date = "";
		  if (obj!= null){
			  date = new SimpleDateFormat("yyyy-MM-dd").format((Date)obj);
		  }
		  
		  System.out.println(((SolrDocument)sdl.get(i)).get("name")+":"+date+":"+(sdl.get(i).get("price")));
	  }
  }

  这时我们所用到的是EmbeddedSolrServer,它是用于嵌入式地solr服务,这里我们不需要向外提供服务,所以我们就用到这个。另外有一个

CommonsHttpSolrServer这个类是用于发送指令的服务,例如我们需要发送HTTP命令来查询,就可以用这个。

下面我们分析一下代码,首先,我们设置了一个环境变量的名称为solr.solr.home,是这个,你没看错,确实是要这样。接下来我们初始化容器,让它加载solr.home的配置文件等。接下来的一系统代码就是构造参数列表。

我们构造完成后的参数列表是这样的:facet.date.start=2004-01-01T00%3A00%3A00Z&indent=on&facet.date=manufacturedate_dt&hl.fl=name&facet.date.gap=%2B1YEAR&wt=xml&facet.date.end=2010-01-01T00%3A00%3A00Z&facet=true&fl=name%2Cprice%2Cscore&q=solr&sort=price+asc&hl=true

跟我们直接在浏览器输入的不太一样,因为它是进行过编码的。构造完成后我们就可以用solrServer进行查询了。

查询得到的结果是JSON格式的,注意,通过程序来查询得到的都是JSON格式,而不是XML格式,不过这样更好,方便我们进行接下来的解析。

接下来的代码就是解析内容啦,应该很容易看懂的。

2)接下来的我们就尝试自己写一个程序来进行索引,而不用post.jar。

程序代码如下:

Java代码   收藏代码
  1. public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException{  
  2.           
  3.         System.setProperty("solr.solr.home","e:\\solrIndex");  
  4.           
  5.                 //这下面三行代码主要是用于加载配置文件  
  6.         SolrConfig solrConfig = new SolrConfig("E:\\solrIndex\\conf\\solrconfig.xml");  
  7.         FileInputStream fis = new FileInputStream("E:\\solrIndex\\conf\\schema.xml");  
  8.         IndexSchema indexSchema = new IndexSchema(solrConfig,"solrconfig",fis);  
  9.           
  10.         SolrIndexWriter siw = new SolrIndexWriter("solrIndex","E:\\solrIndex",new StandardDirectoryFactory()  
  11.                 ,true,indexSchema);  
  12.         Document document = new Document();  
  13.         document.add(new Field("text","测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));  
  14.         document.add(new Field("test_t","再测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));  
  15.         siw.addDocument(document);  
  16.           
  17.         siw.commit();  
  18.         siw.close();  
  19.           
  20.         SolrCore solrCore = new SolrCore("E:\\solrIndex",indexSchema);  
  21.           
  22.         SolrIndexSearcher sis = new SolrIndexSearcher(solrCore,indexSchema,"solrIndex",  
  23.                         new StandardDirectoryFactory().open("E:\\solrIndex"),true);  
  24.         TopDocs docs = sis.search(new TermQuery(new Term("test_t","再")),1);  
  25.           
  26.         System.out.println("找到"+docs.totalHits+"个结果 ");  
  27.           
  28.         for (int i = 0; i < docs.scoreDocs.length; i++) {  
  29.             System.out.println(sis.doc(docs.scoreDocs[i].doc).get("test_t"));  
  30.         }  
  31.           
  32.     }  
public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException{
		
		System.setProperty("solr.solr.home","e:\\solrIndex");
		
                //这下面三行代码主要是用于加载配置文件
		SolrConfig solrConfig = new SolrConfig("E:\\solrIndex\\conf\\solrconfig.xml");
		FileInputStream fis = new FileInputStream("E:\\solrIndex\\conf\\schema.xml");
		IndexSchema indexSchema = new IndexSchema(solrConfig,"solrconfig",fis);
		
		SolrIndexWriter siw = new SolrIndexWriter("solrIndex","E:\\solrIndex",new StandardDirectoryFactory()
				,true,indexSchema);
		Document document = new Document();
		document.add(new Field("text","测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
		document.add(new Field("test_t","再测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
		siw.addDocument(document);
		
		siw.commit();
		siw.close();
		
		SolrCore solrCore = new SolrCore("E:\\solrIndex",indexSchema);
		
		SolrIndexSearcher sis = new SolrIndexSearcher(solrCore,indexSchema,"solrIndex",
						new StandardDirectoryFactory().open("E:\\solrIndex"),true);
		TopDocs docs = sis.search(new TermQuery(new Term("test_t","再")),1);
		
		System.out.println("找到"+docs.totalHits+"个结果 ");
		
		for (int i = 0; i < docs.scoreDocs.length; i++) {
			System.out.println(sis.doc(docs.scoreDocs[i].doc).get("test_t"));
		}
		
	}

  代码不难理解,所以就没写注释了。主要是那段加载配置文件的代码。接下来是添加索引,然后是查询索引,删除的比较简单,直接一句代码

Java代码   收藏代码
  1. solrServer.solrServer.deleteById("SOLR1000");  
solrServer.solrServer.deleteById("SOLR1000");

  或者

Java代码   收藏代码
  1. solrServer.deleteByQuery()  
solrServer.deleteByQuery()

  都比较简单。

3)接下来我们讲一下,很可能会在项目中用到的,就是中文分词,中文分词有蛮多的,有IK,Paoding,mmseg4j,还有另外一些中科院什么地方的。但个人建议用IK或者mmseg4j,这两个有solr都有比较直接的支持,paoding也可以,但可能需要自己写类继承BaseTokenizerFactory然后再进行配置,不难。

上面的例子就是用到中文分词了,如果你发现找不到结果,那很正常,因为还没添加中文分词,你可以把中文改成英文,再查一下,就可以查出来了。

需要添加中文分词,我们要在schema.xml中做文章。找到types标签,在里面找到你想要进行中文分词的类型,比如text类型,我们想要让它的内容用中文分词来进行分析,可以进行配置:

Xml代码   收藏代码
  1. <analyzer type="index">  
  2.         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>  
  3.         <filter class="solr.StopFilterFactory"  
  4.                 ignoreCase="true"  
  5.                 words="stopwords.txt"  
  6.                 enablePositionIncrements="true"  
  7.                 />  
  8.         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>  
  9.         <filter class="solr.LowerCaseFilterFactory"/>  
  10.         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
  11.       </analyzer>  
  12.       <analyzer type="query">  
  13.         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>  
  14.         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>  
  15.         <filter class="solr.StopFilterFactory"  
  16.                 ignoreCase="true"  
  17.                 words="stopwords.txt"  
  18.                 enablePositionIncrements="true"  
  19.                 />  
  20.         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>  
  21.         <filter class="solr.LowerCaseFilterFactory"/>  
  22.         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
  23.       </analyzer>  

  你可以先不理解filter的那些东西,但你一定要理解tokenizer这些地方的配置,它配置了你想要应用的分词器,它必须继承于BaseTokenizerFactory。我们看到analyzer有一个type属性,它表示你要在哪个阶段运用此分词器,如果索引和查询都要用,我们可以不写type,这样solr就会在索引和查询时都使用此分词器,这样配置完成后就可以进行中文分词的测试啦。我们重新把上面的例子添加中文进行索引,然后查询出来,看有没有问题。我的运行结果如下:



  我们找到了结果,证明我们的中文分词已经没问题了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值