`

solr3.5集成paoding和位置搜索及对solrj的使用。

 
阅读更多

http://xiaofancn.iteye.com/blog/1424252

http://wiki.apache.org/solr/Solrj    

http://hi.baidu.com/channing07/blog/item/cb840754a98fc7c9b645ae3e.html

 

 

 * https://github.com/dsmiley/SOLR-2155 关于位置的搜索的增强库

 * http://wiki.apache.org/solr/SpatialSearch#SOLR-2155

 

 

为了让paoding适合高版本的solr3.5,我重新更换了一下paoding编译的部分jar包。


jar是从 solr3.5 项目中apache-tomcat-7.0.27\webapps\solr\WEB-INF\lib复制

 

添加新的分词类

 

 

package net.paoding.analysis.analyzer.solr;
import java.io.Reader;
import java.util.Map;
import net.paoding.analysis.analyzer.PaodingTokenizer;
import net.paoding.analysis.analyzer.TokenCollector;
import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.PaodingMaker;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.solr.analysis.BaseTokenizerFactory;

public class ChineseTokenizerFactory  extends BaseTokenizerFactory {
	/**
	* 最多切分 默认模式
	*/
	public static final String MOST_WORDS_MODE = "most-words";
	/**
	* 按最大切分
	*/
	public static final String MAX_WORD_LENGTH_MODE = "max-word-length";
	private String mode = null;

	public void setMode(String mode) {
	   if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode)
	     || "default".equalsIgnoreCase(mode)) {
	    this.mode = MOST_WORDS_MODE;
	   } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {
	    this.mode = MAX_WORD_LENGTH_MODE;
	   } else {
	    throw new IllegalArgumentException(
	      "不合法的分析器Mode                                                参数设置:"
	        + mode);
	   }
	}

	@Override
	public void init(Map<String,String> args) {
	   super.init(args);
	   setMode(args.get("mode"));
	}

	public Tokenizer create(Reader input) {
	   return new PaodingTokenizer(input, PaodingMaker.make(),
	     createTokenCollector());
	}

	private TokenCollector createTokenCollector() {
	   if (MOST_WORDS_MODE.equals(mode))
	    return new MostWordsTokenCollector();
	   if (MAX_WORD_LENGTH_MODE.equals(mode))
	    return new MaxWordLengthTokenCollector();
	   throw new Error("never happened");
	}
}

 

 

编译后,复制paoding-analysis.jar到solr的lib包中

apache-tomcat-7.0.27\webapps\solr\WEB-INF\lib

 

 

apache-tomcat-7.0.27\webapps\solr\solr\conf\schema.xml

里面很多field的type是text_general

 

所以我们修改text_general类型的切词类,

 

将类型text_general中的

索引查询的切词类,换成我们的切词类。

<tokenizer class="net.paoding.analysis.analyzer.solr.ChineseTokenizerFactory" mode="most-words"/> 

 

起动tomcat,成功后。

 

 

 

在我们的maven,pom.xml文件中添加solrj

 

 

<dependency>
               <artifactId>solr-solrj</artifactId>
               <groupId>org.apache.solr</groupId>
               <version>1.3.0</version>
               <type>jar</type>
               <scope>test</scope>
        </dependency>
        <dependency>
               <artifactId>solr-core</artifactId>
               <groupId>org.apache.solr</groupId>
               <version>1.3.0</version>
               <type>jar</type>
               <scope>test</scope>
        </dependency>
 

 

测试代码,运行前请读下面的注意事项。

 

 

package com.snailteam.team.dao;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest.METHOD;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.snailteam.team.model.City;
import com.snailteam.team.model.Shop;
import com.snailteam.team.service.CityService;
import com.snailteam.team.service.ProductService;
import com.snailteam.team.service.ShopService;
import com.snailteam.team.service.UserService;

/**
 * 
 * https://github.com/dsmiley/SOLR-2155
 * http://wiki.apache.org/solr/SpatialSearch#SOLR-2155
 * 
 * 
 * @author fansxnet
 * 
 */

@SuppressWarnings("restriction")
@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext*.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class UserServiceTest {

	public static String url = "http://localhost:8080/solr/";
	public static CommonsHttpSolrServer server;

	@Before
	public void before() throws MalformedURLException {
		server = new CommonsHttpSolrServer(url);
		server.setParser(new XMLResponseParser());

	}

	@Resource
	public UserService userService;

	@PersistenceContext
	EntityManager em;

	@Resource
	ShopService shopService;

	@Resource
	CityService cityService;

	@Resource
	ProductService productService;

	@Resource
	MongoTemplate mongoTemplate;

	@Test
	public void testTorecallAdIdList() {

	}

	@Test
	public void testSoleAdd() throws SolrServerException, IOException {
		City city = cityService.getAll().get(0);
		List<Shop> shops = shopService.getShops(city);
		Collection<SolrInputDocument> docs = new HashSet<SolrInputDocument>();
		for (Shop shop : shops) {
			SolrInputDocument doc = new SolrInputDocument();
			doc.addField("id", shop.getId());
			if (shop.getLatitude() != null && shop.getLongitude() != null) {
				// latitudes are range -90 to 90
				// longitude are range -180 to 180
				// doc.addField("loc",
				// shop.getLongitude() + "," + shop.getLatitude());
				doc.addField("shopname", shop.getName());
				doc.addField("addr", shop.getAddr());
				doc.addField("tel", shop.getTel());
				doc.addField("traff", shop.getTraff());
				doc.addField("shoploc",
						shop.getLatitude() + "," + shop.getLongitude());
			}
			docs.add(doc);

		}
		server.add(docs);
		server.commit();

	}

	/**
	 * 暂时不可用
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@Test
	public void testSoleSearch() throws SolrServerException, IOException {
		// //
		// select?wt=json&indent=true&fl=shopname,addr,tel,traff,shoploc,_dist_:geodist()&q=*:*&sfield=store&pt=39.904392,116.265033&sort=geodist()%20asc
		SolrQuery query = new SolrQuery();
		query.setQuery("shopname:北京");// &q=*:*
		query.setFacet(true);
		query.setFacetMinCount(1);
		query.setFacetLimit(8);
		// 参数说明
		// indent – 返回的结果是否缩进,默认关闭,
		// fl – 返回的字段
		// sfield – spatial point data is "sfield". See the console output
		// below.
		// pt – latitude longitude
		// sort 排序字段 geodist()%20asc 有问题
		// ,_dist_:geodist()获取距离不正确,无值

		query.set("sfield", "store");//
		query.set("pt", "39.904392,116.265033");
		query.set("sort", "geodist() asc");
		query.set("fl", "_dist_:geodist()");

		query.setFields("shopname", "addr", "tel", "traff", "shoploc");
		server.setParser(new XMLResponseParser());// 设置solrj的解析格式
		QueryResponse rsp = server.query(query, METHOD.POST);
		SolrDocumentList docs = rsp.getResults();
		Iterator<SolrDocument> iterator = docs.iterator();
		while (iterator.hasNext()) {
			SolrDocument solrDoc = iterator.next();
			System.out.println(solrDoc.getFieldValue("shopname") + "-"
					+ solrDoc.getFieldValue("addr") + "-"
					+ solrDoc.getFieldValue("shoploc") + "-");
		}
	}
}

 

 

注意:

为了更形象,我们在solr中定义与我们项目一致的feild字段。新加

 

<!--shop field-->
		
		<field name="shopid" type="text_general" indexed="true" stored="true"/>
		<field name="shopname" type="text_general" indexed="true" stored="true"/>
		<field name="addr" type="text_general" indexed="true" stored="true"/>
		<field name="tel" type="text_general" indexed="true" stored="true"/>
		<field name="traff" type="text_general" indexed="true" stored="true"/>
		<field name="shoploc" type="location" indexed="true" stored="true" /> 
 

 

 

打开solr后台管理页面 http://localhost:8080/solr/admin/

search

 

shopid:3153

 

 

 

  • 大小: 47.7 KB
分享到:
评论

相关推荐

    Solrj and Solr and LDAP and SearchEngine

    搜索功能包括对艺术家名称、别名和成员字段的匹配,这展示了Solr对多字段搜索的支持。同时,Solr还支持高亮显示搜索结果中的关键词,以便用户能快速识别搜索匹配的部分。 【Solr配置】 配置Solr涉及到多个步骤,...

    SOLR的应用教程

    **SOLR应用教程** **一、概述** ...这个SOLR应用教程涵盖了从基础概念到实际应用,包括安装配置、索引和搜索操作、SolrJ的使用以及性能优化等多个方面,为读者提供了一个全面了解和掌握Solr的路径。

    solr深入浅出

    《Solr深入浅出》是一本详尽介绍Apache Solr这一全文搜索引擎的指南。Solr以其高效、可扩展和易管理的特性,在企业级搜索应用中广泛应用。...通过对Solr的深入理解和实践,可以更好地发挥其在大数据环境下的搜索优势。

    solr教材-PDF版

    - 展示如何使用SolrJ进行搜索请求,并处理返回的结果。 **4.2 Solrj的使用说明** - **4.2.1 AddingData to Solr**:通过SolrJ向Solr添加数据的方法。 - **4.2.2 Directly adding POJOsto Solr**:直接将Java对象...

    Solrj 中文教程

    最终,考虑到灵活性和扩展性等因素,本教程推荐使用Apache Solr作为企业级搜索引擎解决方案。 ##### 1.2 Solr的特性 **1.2.1 Solr使用Lucene并且进行了扩展** Solr基于Lucene实现,但增加了许多高级功能,例如...

    开源企业搜索引擎SOLR的 应用教程

    Solr不仅提供了强大的全文搜索能力,还能支持复杂的查询需求,并且具有良好的可扩展性和可靠性,是企业级搜索项目的首选。 **1.2 Solr的特性** - **1.2.1 Solr使用Lucene并且进行了扩展** Solr的核心是基于Lucene...

    开源企业搜索引擎SOLR的应用教程

    综上所述,Apache Solr是一款功能强大、高度可定制的企业级搜索引擎,它不仅可以高效地处理海量数据的搜索需求,还具备灵活的配置选项和丰富的API支持,使得开发者能够轻松集成到各种应用场景中。

    开源企业搜索引擎SOLR的应用教程.pdf

    通过本教程,用户可以系统地学习如何使用Solr搭建企业搜索引擎,并通过一系列实例和方法对Solr搜索引擎进行调优和问题排查。Apache Solr不仅可以帮助企业快速实现搜索功能,还能够通过定制和优化,满足不同企业的...

    solr从入门到精通教程

    - Solrj的使用说明:介绍了如何使用SolrJ添加数据、直接添加POJO到Solr和从Solr读取数据。 - 创建查询:说明了如何创建查询并使用SolrJ进行索引的创建。 5. Solr实际应用测试报告 - 线下压力测试报告:提供了线下...

    Solr 教程 pdf

    使用SolrJ时,可调用搜索接口实例,用SolrJ添加数据和读取数据,创建查询,以及使用SolrJ创建索引。同时也涉及SolrJ包的结构说明。 在实际应用测试报告中,包含了线下压力测试报告和线上环境运行报告。 性能调优...

    solr技术方案.pdf

    Solr技术方案是一种针对全文搜索和检索的开源解决方案,它基于Apache Lucene,提供高性能、高可用性的搜索服务。在面对传统数据库层面的模糊搜索(like查询)导致的性能问题和用户体验不佳的情况时,Solr成为了提升...

Global site tag (gtag.js) - Google Analytics