`

solr第一弹 autocomplete(自动补全)

阅读更多

   百度和google中都有文字的自动补全功能,以前项目中也用过实现思路非常简单一般就是extjs 或者jquery 的前台插件通过异步加载数据然后显示,

          现在项目的数据源是基于solr所以只有使用solr的autocomplete功能,搜索了很多无数 百度上的 网页根本没有关于solr的自动补全的功能实现,就连关于solr应用性的文章也是比较少的,无奈只好在google上搞了,全都是英文的,尝试了很多的方法都不能使用最后发现是solr api的问题国外的大部分资料都是用得这个写法

问题代码代码 复制代码 收藏代码
  1. private List<Term> query(String q, int limit) {   
  2.     List<Term> items = null;   
  3.     CommonsHttpSolrServer server = null;   
  4.   
  5.      try {   
  6.          server = new CommonsHttpSolrServer("http://localhost:8983/solr");   
  7.      } catch(Exception e) { e.printStackTrace(); }   
  8.   
  9.      // escape special characters   
  10.      SolrQuery query = new SolrQuery();   
  11.      query.addTermsField("spell");   
  12.      query.setTerms(true);   
  13.      query.setTermsLimit(limit);   
  14.      query.setTermsLower(q);   
  15.      query.setTermsPrefix(q);   
  16.      query.setQueryType("/terms");   
  17.   
  18.      try {   
  19.          QueryResponse qr = server.query(query);   
  20.          TermsResponse resp = qr.getTermsResponse();   
  21.          items = resp.getTerms("spell");   
  22.      } catch (SolrServerException e) {   
  23.         items = null;   
  24.      }   
  25.   
  26.      return items;   
  27. }  
private List<Term> query(String q, int limit) {
    List<Term> items = null;
    CommonsHttpSolrServer server = null;

     try {
         server = new CommonsHttpSolrServer("http://localhost:8983/solr");
     } catch(Exception e) { e.printStackTrace(); }

     // escape special characters
     SolrQuery query = new SolrQuery();
     query.addTermsField("spell");
     query.setTerms(true);
     query.setTermsLimit(limit);
     query.setTermsLower(q);
     query.setTermsPrefix(q);
     query.setQueryType("/terms");

     try {
         QueryResponse qr = server.query(query);
         TermsResponse resp = qr.getTermsResponse();
         items = resp.getTerms("spell");
     } catch (SolrServerException e) {
      	items = null;
     }

     return items;
}

 但是不知道是人品问题还是怎么的,我下载的solr1.4  SolrQuery类根本就没有这个addTermsField 和setTermsPrefix 方法,

这是我的下载地址http://mirror.nus.edu.sg/apache//lucene/solr/1.4.1/

 

solr实现autocomplete功能其实非常简单,仅仅需要下边的这个url就可以实现

Solr的查询条件代码 复制代码 收藏代码
  1. fl=id,name&rows=0&q=*:*&facet=true&facet.field=name_auto&facet.mincount=1&facet.prefix=input  
fl=id,name&rows=0&q=*:*&facet=true&facet.field=name_auto&facet.mincount=1&facet.prefix=input

 我们所要做的就是用solrj的api拼装成这个字符串请求tomcat就ok了

下面是拼装代码

Url拼装代码代码 复制代码 收藏代码
  1. CommonsHttpSolrServer service = new CommonsHttpSolrServer(   
  2.                 "http://localhost:8080/solr/targetCore");   
  3.         List<Term> list = new ArrayList<Term>();   
  4.         QueryResponse queryResponse = new QueryResponse();   
  5.         SolrQuery query = new SolrQuery();   
  6.         // fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet.   
  7.         // mincount=1&facet.prefix=sony   
  8.         //facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText   
  9.         try {   
  10.             query.setFacet(true);   
  11.             query.setRows(0);   
  12.             query.setQuery("*:*");   
  13.             query.setFacetPrefix("sony");   
  14.             query.addFacetField("searchText");   
  15.             System.out.println(query.toString());   
  16.             queryResponse = service.query(query, METHOD.POST);   
  17.         } catch (Exception e) {   
  18.             // TODO: handle exception   
  19.             e.printStackTrace();   
  20.         }  
CommonsHttpSolrServer service = new CommonsHttpSolrServer(
				"http://localhost:8080/solr/targetCore");
		List<Term> list = new ArrayList<Term>();
		QueryResponse queryResponse = new QueryResponse();
		SolrQuery query = new SolrQuery();
		// fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet.
		// mincount=1&facet.prefix=sony
		//facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText
		try {
			query.setFacet(true);
			query.setRows(0);
			query.setQuery("*:*");
			query.setFacetPrefix("sony");
			query.addFacetField("searchText");
			System.out.println(query.toString());
			queryResponse = service.query(query, METHOD.POST);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}

  返回的内容如下



 searchText 中的以sony开头的词都是自动补全的结果,其实这些都是lucene中的term

 

下边代码使用solrj的api解析文本的过程

Java代码 复制代码 收藏代码
  1. CommonsHttpSolrServer service = new CommonsHttpSolrServer(   
  2.             "http://localhost:8080/solr/targetCore");   
  3.     List<Term> list = new ArrayList<Term>();   
  4.     QueryResponse queryResponse = new QueryResponse();   
  5.     SolrQuery query = new SolrQuery();   
  6.     // fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet.   
  7.     // mincount=1&facet.prefix=sony   
  8.     //facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText   
  9.     try {   
  10.         query.setFacet(true);   
  11.         query.setRows(0);   
  12.         query.setQuery("*:*");   
  13.         query.setFacetPrefix("索尼");   
  14.         query.addFacetField("searchText");   
  15.         System.out.println(query.toString());   
  16.         queryResponse = service.query(query, METHOD.POST);   
  17.     } catch (Exception e) {   
  18.         // TODO: handle exception   
  19.         e.printStackTrace();   
  20.     }   
  21.     NamedList<Object> nl = queryResponse.getResponse();   
  22.   
  23.     NamedList<Object> nl2 = (NamedList<Object>) nl.get("facet_counts");   
  24.     NamedList<Object> nl3 = (NamedList<Object>) nl2.get("facet_fields");   
  25.     NamedList<Object> nl4 = (NamedList<Object>) nl3.get("searchText");   
  26.     System.out.println(nl4.size());   
  27.     Iterator<Entry<String, Object>> it = nl4.iterator();   
  28.     while (it.hasNext()) {   
  29.         Entry<String, Object> entry = it.next();   
  30.         System.out.println(entry.getKey() + "____" + entry.getValue());   
  31.     }   
  32.   
  33.     SolrDocumentList results = queryResponse.getResults();   
  34.   
  35.     SolrResult solrResult = new SolrResult();  
	CommonsHttpSolrServer service = new CommonsHttpSolrServer(
				"http://localhost:8080/solr/targetCore");
		List<Term> list = new ArrayList<Term>();
		QueryResponse queryResponse = new QueryResponse();
		SolrQuery query = new SolrQuery();
		// fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet.
		// mincount=1&facet.prefix=sony
		//facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText
		try {
			query.setFacet(true);
			query.setRows(0);
			query.setQuery("*:*");
			query.setFacetPrefix("索尼");
			query.addFacetField("searchText");
			System.out.println(query.toString());
			queryResponse = service.query(query, METHOD.POST);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		NamedList<Object> nl = queryResponse.getResponse();

		NamedList<Object> nl2 = (NamedList<Object>) nl.get("facet_counts");
		NamedList<Object> nl3 = (NamedList<Object>) nl2.get("facet_fields");
		NamedList<Object> nl4 = (NamedList<Object>) nl3.get("searchText");
		System.out.println(nl4.size());
		Iterator<Entry<String, Object>> it = nl4.iterator();
		while (it.hasNext()) {
			Entry<String, Object> entry = it.next();
			System.out.println(entry.getKey() + "____" + entry.getValue());
		}

		SolrDocumentList results = queryResponse.getResults();

		SolrResult solrResult = new SolrResult();
  • 大小: 13.7 KB
分享到:
评论

相关推荐

    solr搜索自动补全

    Solr搜索自动补全是现代电商网站常见的一项功能,它能够显著提升用户体验。当用户在搜索框输入关键词时,系统会根据输入的文字,实时展示一个下拉列表,该列表包含用户可能想要搜索的查询项。这不仅可以引导用户更快...

    捕鱼java源码-solr-autocomplete:Solr自动完成实现

    bass"在内的建议(注意"bass"不一定是第一个词) 内容 支持矩阵 solr-自动完成 索尔 1.6.7.1.0 7.1.0 1.6.6.5.1 6.5.1 1.6.5.2.0 5.2.0 1.6.6.0.1 6.0.1 1.6.6.3.0 6.3.0 建造 您需要 maven 和 JDK 8: $ mvn clean ...

    solr定时自动同步数据库需要用到的apache-solr-dataimportscheduler.jar包

    Apache Solr是一款强大的开源搜索引擎,它能够高效地处理和索引大量数据,提供快速的全文检索、 faceting、高亮显示等高级功能。在实际应用中,为了保持搜索结果的实时性,我们往往需要将数据库中的数据实时或定时...

    solr

    除了基本的全文检索外,Solr还支持拼音搜索和自动补全等功能。例如,可以通过`SpellCheckResponse`类来获取拼写建议。 ```java SolrQuery spellcheckQuery = new SolrQuery("*:*"); spellcheckQuery.set Spellcheck...

    Apache Solr(solr-7.7.3.zip)

    - **拼写检查与自动补全(Spellcheck & Autocomplete)**: Solr 提供了拼写纠正功能,以及基于倒排索引的自动补全服务,提升用户输入体验。 - **分布式搜索(Distributed Search)**: 对于大规模数据,Solr 支持...

    SolrTest solr测试工程

    3. **自动完成(Autocomplete)**:Solr支持实时的搜索建议和自动补全功能,这在构建用户友好的搜索体验时非常关键。实现这一功能通常需要配置`SpellChecker`或`EdgeNgramFilterFactory`,前者用于检查拼写错误,后...

    bbop-widget-solr-autocomplete:Solr的自动完成小部件

    **bbop-widget-solr-autocomplete** 是一个专门针对Solr搜索引擎的JavaScript小部件,用于实现高效的自动完成功能。在Web应用中,这种小部件能够极大地提升用户体验,尤其是在需要进行复杂搜索查询时,用户可以快速...

    solr服务器_solr_

    Solr服务器是Apache Lucene项目的一个子项目,是一款开源的企业级搜索平台,专门用于处理大量文本数据的全文检索、搜索和分析。它基于Java开发,能够处理多种数据源,包括XML、JSON、CSV等,提供了高效、可扩展的...

    solr4.7服务搭建

    1. **启动 Tomcat**:启动 Tomcat 服务器,等待 Solr 战包自动部署。 2. **测试连接**:通过浏览器访问 `http://127.0.0.1:8080/solr/`,如果页面显示 Solr 的管理界面,则表示部署成功。 #### 九、中文分词技术...

    solr7.5_ik分词器,suggest配置源文件文件

    Suggest组件则为Solr提供了自动补全和提示功能,极大地提升了用户体验。 标题中的“solr7.5_ik分词器,suggest配置源文件”指的是在Solr 7.5版本中使用Ik分词器和Suggest组件进行配置和使用的源文件。Ik分词器是...

    《apachesolr7官方指南》PDF

    5. 拼写建议与自动补全:Solr内置了拼写检查和自动补全功能,可以帮助用户纠正输入错误并提供相关建议,提升用户体验。 6. 多语言支持:Solr具有内置的多种语言分析器,可以处理不同语言的文本,包括中文、英文、...

    Apache Solr(solr-8.11.1.tgz)

    Apache Solr 是一个开源的全文搜索引擎,由Apache软件基金会维护,是Lucene项目的一部分。它提供了高效、可扩展的搜索和导航功能,广泛应用于企业级的搜索应用中。Solr-8.11.1是该软件的一个特定版本,包含了最新的...

    solr增量更新架包apache-solr-dataimportscheduler.jar

    "apache-solr-dataimportscheduler.jar" 是一个专门为Solr设计的扩展包,用于实现自动化的数据增量更新调度。 首先,我们要理解Solr的数据导入过程。Solr使用DataImportHandler(DIH)来从关系型数据库、XML文件或...

    solr的一个小例子

    Solr,全称为Apache Solr,是一款开源的全文搜索引擎,由Apache软件基金会开发。它提供了高效、可扩展的搜索和导航功能,常被用于大型网站的搜索解决方案。在这个"solr的一个小例子"中,我们将探讨如何搭建一个基础...

    Solr全文检索.pdf

    6. Solr 的维护方式:Solr 的维护可以通过手动添加或使用 SpringDataSolr 来操作 Solr 索引库,第一次上线的时候可以手动往 Solr 索引库导入一批数据,后期可以自动更新。 7. 全文检索的实现:全文检索是由业务来定...

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    这使得 Solr 在启动时能够自动加载 ikanalyzer 类库。 3. **配置Schema.xml**:在 Solr 的 schema.xml 文件中,我们需要定义字段类型(FieldType)并指定使用 ikanalyzer。例如,可以创建一个名为 `text_ik` 的字段...

    apache-solr-ref-guide

    通过正确配置分析器和过滤器,可以处理各种语言的文本,并能够实现复杂的搜索功能,如自动补全、同义词搜索等。 索引与基本数据操作也是Solr中一个关键的环节。索引是将文档数据按照某种逻辑结构存储起来以便于快速...

    solr开发应用教程

    4. 断词建议:提供拼写纠错和自动补全功能,增强用户体验。 5. 近似搜索:通过模糊匹配,找到与输入关键词相似的搜索结果。 6. 聚类和分类:对搜索结果进行自动聚类,帮助用户发现相关主题。 六、分布式搜索 ...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    Solr 数据导入调度器(solr-dataimport-scheduler.jar)是一个专门为Apache Solr 7.x版本设计的组件,用于实现数据的定期索引更新。在理解这个知识点之前,我们需要先了解Solr的基本概念以及数据导入处理...

    solr-4.4.0.tgz

    Solr 是一个开源的全文搜索引擎,由 Apache 软件基金会开发。版本 4.4.0 是 Solr 的一个重要里程碑,它包含了丰富的特性和改进。这个“solr-4.4.0.tgz”文件是一个针对 Linux 系统的压缩包,用于在服务器上部署 Solr...

Global site tag (gtag.js) - Google Analytics