- 浏览: 330959 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
di1984HIT:
谢谢,写的不错。
使用hector操作Cassandra -
mr_von:
非常感谢!
paoding的分词使用 -
howgoo:
http://www.dhtmlx.com/docs/prod ...
dhtmlxGrid分页与排序 -
青春的、脚步:
谢谢
spring-data-mongodb的MongoTemplate 使用小例子 -
青春的、脚步:
xiaofancn 写道青春的、脚步 写道这个能查询都个值在某 ...
spring-data-mongodb的MongoTemplate 使用小例子
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
发表评论
-
spring cloud gateway 全局过滤器。
2019-03-17 23:11 527spring cloud gateway 网关 ... -
elasticsearch 5.4搜索
2017-05-19 08:37 148@Test public void t ... -
netty简单的操作memcached
2017-04-19 18:59 976pom文件 <dependency> ... -
juc系列-Executor框架
2017-03-20 13:34 699转自 juc系列-Executor框架 什 ... -
ReentrantLock 类
2017-03-19 21:11 11.1 什么是reentrantlock java.u ... -
juc之CountDownLatch、CyclicBarrier和Semaphore例子
2017-03-19 17:23 833import java.util.concurren ... -
netty客户端与服务端例子
2017-03-12 20:07 2799package com.snailteam.nett ... -
freemaker集成spring
2017-02-26 19:00 567<bean id="freeMark ... -
spring集成Hessian插件配置改成自动注入。
2017-02-10 15:39 834原来的配置 <bean name="/ ... -
web开发模版
2017-02-09 14:42 0# Rules reminder: # DEBUG &l ... -
Java多线程
2017-02-04 14:39 515线程状态图 新建状态(New): ... -
hash冲突解决
2017-01-23 18:30 4541、开放地址法有一个公式: m是hash表长度,di ... -
mybatis +spring 分库
2015-04-30 17:56 353<context:component-scan b ... -
Java并发任务处理例子
2014-02-12 16:06 1125public void init() { su ... -
JAVA动态代理模式
2012-10-03 01:01 1183这是我要实现的效果 public static ... -
PyMining - 基于Python的数据挖掘平台来进行文本分类
2012-07-23 22:00 3775http://code.google.com/p/python ... -
paoding的分词使用
2012-06-13 21:30 4865paoding下载 http://code.googl ... -
使用spring-hadoop操作hadoop
2012-05-20 02:12 32参考文章 http://blog.springsource. ... -
日期处理DateUtils
2012-03-24 09:47 4811import java.text.SimpleDateF ... -
Cassandra的数据分布情况测试
2012-03-16 15:09 20331、规划种子节点ip和Token值的对应 4个种子 ...
相关推荐
搜索功能包括对艺术家名称、别名和成员字段的匹配,这展示了Solr对多字段搜索的支持。同时,Solr还支持高亮显示搜索结果中的关键词,以便用户能快速识别搜索匹配的部分。 【Solr配置】 配置Solr涉及到多个步骤,...
**SOLR应用教程** **一、概述** ...这个SOLR应用教程涵盖了从基础概念到实际应用,包括安装配置、索引和搜索操作、SolrJ的使用以及性能优化等多个方面,为读者提供了一个全面了解和掌握Solr的路径。
《Solr深入浅出》是一本详尽介绍Apache Solr这一全文搜索引擎的指南。Solr以其高效、可扩展和易管理的特性,在企业级搜索应用中广泛应用。...通过对Solr的深入理解和实践,可以更好地发挥其在大数据环境下的搜索优势。
- 展示如何使用SolrJ进行搜索请求,并处理返回的结果。 **4.2 Solrj的使用说明** - **4.2.1 AddingData to Solr**:通过SolrJ向Solr添加数据的方法。 - **4.2.2 Directly adding POJOsto Solr**:直接将Java对象...
最终,考虑到灵活性和扩展性等因素,本教程推荐使用Apache Solr作为企业级搜索引擎解决方案。 ##### 1.2 Solr的特性 **1.2.1 Solr使用Lucene并且进行了扩展** Solr基于Lucene实现,但增加了许多高级功能,例如...
Solr不仅提供了强大的全文搜索能力,还能支持复杂的查询需求,并且具有良好的可扩展性和可靠性,是企业级搜索项目的首选。 **1.2 Solr的特性** - **1.2.1 Solr使用Lucene并且进行了扩展** Solr的核心是基于Lucene...
综上所述,Apache Solr是一款功能强大、高度可定制的企业级搜索引擎,它不仅可以高效地处理海量数据的搜索需求,还具备灵活的配置选项和丰富的API支持,使得开发者能够轻松集成到各种应用场景中。
通过本教程,用户可以系统地学习如何使用Solr搭建企业搜索引擎,并通过一系列实例和方法对Solr搜索引擎进行调优和问题排查。Apache Solr不仅可以帮助企业快速实现搜索功能,还能够通过定制和优化,满足不同企业的...
- Solrj的使用说明:介绍了如何使用SolrJ添加数据、直接添加POJO到Solr和从Solr读取数据。 - 创建查询:说明了如何创建查询并使用SolrJ进行索引的创建。 5. Solr实际应用测试报告 - 线下压力测试报告:提供了线下...
使用SolrJ时,可调用搜索接口实例,用SolrJ添加数据和读取数据,创建查询,以及使用SolrJ创建索引。同时也涉及SolrJ包的结构说明。 在实际应用测试报告中,包含了线下压力测试报告和线上环境运行报告。 性能调优...
Solr技术方案是一种针对全文搜索和检索的开源解决方案,它基于Apache Lucene,提供高性能、高可用性的搜索服务。在面对传统数据库层面的模糊搜索(like查询)导致的性能问题和用户体验不佳的情况时,Solr成为了提升...