`
cxshun
  • 浏览: 724554 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

solr初体验(4)

阅读更多

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

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

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。

程序代码如下:

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"));
		}
		
	}

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

solrServer.solrServer.deleteById("SOLR1000");

  或者

solrServer.deleteByQuery()

  都比较简单。

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

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

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

<analyzer type="index">
        <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>

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



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

  • 大小: 3.8 KB
分享到:
评论
3 楼 zhaizhisheng 2013-04-06  
谢谢啊!
2 楼 cxshun 2013-01-27  
zhaizhisheng 写道
你好我刚接触SOLR,能不能说一下都引用了哪些JAR包,谢谢

其实最主要的就是一个solr-core,,然后就是solrj,这个是solr用于JAVA的一个客户端,其他的,貌似都有在solrj-libs文件夹内,solr下载中有带那些信赖的,你直接放进去就行了。
1 楼 zhaizhisheng 2013-01-10  
你好我刚接触SOLR,能不能说一下都引用了哪些JAR包,谢谢

相关推荐

    solr初体验

    Solr初体验:深入理解开源全文搜索引擎 Solr,全称Apache Solr,是一个高度可扩展的、开源的全文搜索引擎平台。它允许开发者通过HTTP接口对大量文本数据进行高效的搜索和分析。Solr由Java编写,是Apache软件基金会...

    Solr初体验

    Solr初体验 Apache Solr 是一款开源的全文搜索引擎,基于 Lucene 库,提供了高效、可扩展的搜索和分析功能。它不仅用于网站的全文检索,还广泛应用于企业级的文档检索、商品搜索以及数据挖掘等领域。这篇博客将带你...

    Apache Solr 4 Cookbook

    Apache Solr 4 Cookbook Apache Solr 4 Cookbook Apache Solr 4 Cookbook Apache Solr 4 Cookbook Apache Solr 4 Cookbook

    lucene4 solr4j arIk4

    《深入理解Lucene4、Solr4J与AriK4:构建高效全文搜索引擎》 在信息化时代,数据量呈爆炸性增长,如何快速、准确地检索信息成为了一个至关重要的问题。为此,开源社区提供了强大的全文搜索引擎框架——Lucene4,...

    solr6配置mmseg4j

    Solr6是一款强大的开源搜索引擎,广泛...总的来说,配置Solr6中的mmseg4j是一个涉及下载依赖、修改配置文件、重启服务的过程,通过这个过程,我们可以使Solr具备更强大的中文分词能力,从而提高搜索质量和用户体验。

    mmseg4j-solr-2.4.0.jar

    《mmseg4j在Solr中的应用与实践》 在信息检索和文本处理领域,中文分词是至关重要的一步,它决定了文本理解的准确性。在Java环境下,mmseg4j是一个广泛使用的开源中文分词库,它为Java开发者提供了强大的中文处理...

    Apache Solr(solr-8.11.1.tgz)

    同时,你可以利用Solr的 faceting(分面搜索)、highlighting(高亮显示)、spell checking(拼写检查)等功能来提高用户体验。此外,Solr还支持实时添加和更新文档,以及高效的近实时搜索。 在部署和使用Solr时,...

    solr(solr-9.0.0.tgz)

    4. **docs** 文件夹:包含了Solr的用户文档,可以帮助开发者和管理员了解Solr的使用方法和API。 5. **example** 文件夹:提供了一个简单的Solr实例,包括了如何设置和运行的基本示例,对于初学者来说非常有用。 6....

    solr-4-10.3.zip

    6. **Highlighting(高亮显示)**: Solr可以自动识别查询结果中的匹配部分并进行高亮,提高用户体验。 7. **XML/JSON API**: Solr使用HTTP协议提供服务,可以通过XML或JSON格式的请求来添加、删除和查询文档,便于...

    solr-6.2.0源码

    4. 高级搜索功能:Solr提供丰富的查询语法,如布尔逻辑、短语匹配、模糊匹配、字段限制等,以及自定义查询解析器和过滤器。 5. 自定义排序和评分:用户可以自定义文档排序规则和评分算法,以满足特定的业务需求。 6....

    solr4.7服务搭建

    1. **复制 log4j.properties 文件**:将 `D:\solr\solr-4.7.2\example\resources` 下的 log4j.properties 文件复制到 `D:\solr\tomcat7\webapps\solr\WEB-INF\classes` 目录。 #### 七、配置 web.xml 文件 1. **...

    Apache Solr(solr-8.11.1.zip)

    4. **配置文件**:压缩包中的配置文件包括`solrconfig.xml`和`schema.xml`。`solrconfig.xml`定义了Solr实例的行为,包括搜索处理流程、缓存策略和更新处理。`schema.xml`(在较新版本中为managed schema)用于定义...

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

    兼容solr4.10.3的mmseg4j-1.9.1分词器

    "兼容solr4.10.3的mmseg4j-1.9.1分词器" 这个标题表明我们正在讨论的是一个针对Solr 4.10.3版本优化的mmseg4j分词器,版本号为1.9.1。mmseg4j是一款广泛使用的Java实现的中文分词库,它提供了高效且精准的中文分词...

    solr服务器_solr_

    4. **Schema**:Schema定义了Solr如何解析和存储数据。它包括字段定义(如字段类型、是否可搜索、是否存储等)和动态字段规则。合理的Schema设计是确保Solr性能的关键。 5. **请求处理器(Request Handler)**:...

    solr-7.4.0.zip

    4. `example`目录:提供了一个简单的Solr示例,包括一个预配置的Solr实例,可以快速启动并开始使用Solr。 5. `docs`目录:包含了Solr的文档,包括用户手册、API参考等。 6. `contrib`目录:包含了一些社区贡献的模块...

    solr 4-10.3 工具包 包含工程jar包

    这个压缩包"solr 4-10.3 工具包 包含工程jar包"显然包含了Solr 4.10.3版本的相关组件和库,这对于开发者来说是极其宝贵的资源,特别是那些在Java环境下工作并需要构建或扩展Solr应用的人。 Solr 4.10.3是一个重要的...

    solr(solr-9.0.0-src.tgz)源码

    Solr是Apache软件基金会的一个开源项目,它是基于Java的全文搜索服务器,被广泛应用于企业级搜索引擎的构建。源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕...

    solr安装包下载地址

    Solr,全称为Apache Solr,是一款开源的企业级搜索平台,由Apache软件基金会开发并维护。它是基于Java的,能够处理大量数据并提供...通过深入学习和实践,你可以充分利用Solr的特性,为你的项目带来卓越的搜索体验。

Global site tag (gtag.js) - Google Analytics