设为首页 收藏本站
查看: 615|回复: 0

[经验分享] solr空间搜索实现附近酒店的搜索

[复制链接]

尚未签到

发表于 2015-11-12 08:53:39 | 显示全部楼层 |阅读模式
  现在移动开发中越来越多的App都有周边搜索,有找附近的人的,附近的酒店,附近的餐馆的。接下来我们就来讲一下强大的Solr来帮我们构建周边搜索之酒店搜索。
  
  1 下载 Solr 3.6.2
  下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/3.6.2
  提取apache-solr-3.6.2.zip里的apache-solr-3.6.2.war到F:\, 后面会讲解如何部署这个war包
  2 建立solr的索引库配置
  2.1 在D:\建立目录hotel_solr
  2.2 在D:\hotel_solr下新建solr.xml,内容如下:
Xml代码 DSC0000.gif DSC0001.png DSC0002.gif

  • <?xmlversion=&quot;1.0&quot;encoding=&quot;UTF-8&quot;?>
  • <solrpersistent=&quot;false&quot;>
  •   <coresadminPath=&quot;/admin/cores&quot;>
  •     <corename=&quot;core0&quot;instanceDir=&quot;core0&quot;/>
  •     <!--<core name=&quot;core1&quot; instanceDir=&quot;core1&quot; />-->
  •   </cores>
  • </solr>
   2.3 在D:\hotel_solr新建core0\conf目录  
  2.4 在D:\hotel_solr\core0\conf目录下,新建schema.xml文件,内容如下:
Xml代码

  • <?xmlversion=&quot;1.0&quot;?>
  • <schemaname=&quot;examplecore zero&quot;version=&quot;1.1&quot;>
  •   <types>
  •    <fieldTypename=&quot;string&quot;class=&quot;solr.StrField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;boolean&quot;class=&quot;solr.BoolField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;integer&quot;class=&quot;solr.IntField&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;int&quot;class=&quot;solr.TrieIntField&quot;precisionStep=&quot;0&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;float&quot;class=&quot;solr.TrieFloatField&quot;precisionStep=&quot;0&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;long&quot;class=&quot;solr.TrieLongField&quot;precisionStep=&quot;0&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;double&quot;class=&quot;solr.TrieDoubleField&quot;precisionStep=&quot;0&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;tint&quot;class=&quot;solr.TrieIntField&quot;precisionStep=&quot;8&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;tfloat&quot;class=&quot;solr.TrieFloatField&quot;precisionStep=&quot;8&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;tlong&quot;class=&quot;solr.TrieLongField&quot;precisionStep=&quot;8&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;tdouble&quot;class=&quot;solr.TrieDoubleField&quot;precisionStep=&quot;8&quot;omitNorms=&quot;true&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;sint&quot;class=&quot;solr.SortableIntField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;slong&quot;class=&quot;solr.SortableLongField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;sfloat&quot;class=&quot;solr.SortableFloatField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;sdouble&quot;class=&quot;solr.SortableDoubleField&quot;sortMissingLast=&quot;true&quot;omitNorms=&quot;true&quot;/>
  •          <fieldTypename=&quot;date&quot;class=&quot;solr.TrieDateField&quot;omitNorms=&quot;true&quot;precisionStep=&quot;0&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldTypename=&quot;tdate&quot;class=&quot;solr.TrieDateField&quot;omitNorms=&quot;true&quot;precisionStep=&quot;6&quot;positionIncrementGap=&quot;0&quot;/>
  •          <fieldtypename=&quot;ignored&quot;stored=&quot;false&quot;indexed=&quot;false&quot;class=&quot;solr.StrField&quot;/>
  •          <fieldtypename=&quot;location&quot;class=&quot;solr.LatLonType&quot;subFieldSuffix=&quot;_d&quot;/>
  •          <fieldTypename=&quot;text&quot;class=&quot;solr.TextField&quot;positionIncrementGap=&quot;100&quot;>
  •                <analyzertype=&quot;index&quot;>
  •                  <tokenizerclass=&quot;solr.StandardTokenizerFactory&quot;/>
  •                  <filterclass=&quot;solr.LowerCaseFilterFactory&quot;/>
  •                </analyzer>
  •                <analyzertype=&quot;query&quot;>
  •                  <tokenizerclass=&quot;solr.StandardTokenizerFactory&quot;/>
  •                  <filterclass=&quot;solr.LowerCaseFilterFactory&quot;/>
  •                </analyzer>
  •          </fieldType>
  •   </types>
  • <fields>
  •   <fieldname=&quot;hotel_id&quot;type=&quot;integer&quot;indexed=&quot;true&quot;stored=&quot;true&quot;required=&quot;true&quot;/>
  •   <fieldname=&quot;crawl_hotel_id&quot;   type=&quot;string&quot;  indexed=&quot;true&quot; stored=&quot;true&quot; multiValued=&quot;false&quot;required=&quot;true&quot;/>   
  •   <fieldname=&quot;name&quot;   type=&quot;text&quot;  indexed=&quot;true&quot; stored=&quot;true&quot; multiValued=&quot;false&quot;required=&quot;true&quot;/>   
  •   <fieldname=&quot;address&quot;   type=&quot;text&quot;  indexed=&quot;true&quot; stored=&quot;true&quot; multiValued=&quot;false&quot;required=&quot;true&quot;/>   
  •   <fieldname=&quot;search_kw&quot;type=&quot;text&quot;indexed=&quot;true&quot;multiValued=&quot;true&quot;stored=&quot;false&quot;/>   
  •   <fieldname=&quot;latlng&quot;type=&quot;location&quot;indexed=&quot;true&quot;/>
  •   <dynamicFieldname=&quot;*_d&quot;type=&quot;double&quot;indexed=&quot;true&quot;stored=&quot;true&quot;/>
  • </fields>
  • <copyFieldsource=&quot;name&quot;dest=&quot;search_kw&quot;/>
  • <copyFieldsource=&quot;address&quot;dest=&quot;search_kw&quot;/>
  • <uniqueKey>hotel_id</uniqueKey>
  • <defaultSearchField>search_kw</defaultSearchField>
  • <solrQueryParserdefaultOperator=&quot;AND&quot;/>
  • </schema>
    2.5 在D:\hotel_solr\core0\conf目录下,新建solrconfig.xml文件,内容如下:
Xml代码

  • <?xmlversion=&quot;1.0&quot;encoding=&quot;UTF-8&quot;?>
  • <config>
  •   <luceneMatchVersion>LUCENE_36</luceneMatchVersion>
  •   <directoryFactoryname=&quot;DirectoryFactory&quot;class=&quot;${solr.directoryFactory:solr.StandardDirectoryFactory}&quot;/>
  •   <updateHandlerclass=&quot;solr.DirectUpdateHandler2&quot;/>
  •   <requestDispatcherhandleSelect=&quot;true&quot;>
  •     <requestParsersenableRemoteStreaming=&quot;false&quot;multipartUploadLimitInKB=&quot;2048&quot;/>
  •   </requestDispatcher>
  •   <requestHandlername=&quot;standard&quot;class=&quot;solr.StandardRequestHandler&quot;default=&quot;true&quot;/>
  •   <requestHandlername=&quot;/update&quot;class=&quot;solr.XmlUpdateRequestHandler&quot;/>
  •   <requestHandlername=&quot;/admin/&quot;class=&quot;org.apache.solr.handler.admin.AdminHandlers&quot;/>
  •   <admin>
  •     <defaultQuery>*:*</defaultQuery>
  •   </admin>
  • </config>
    到这里为止Solr的索引配置完成.  
  3 配置tomcat
  3.1 让tomcat支持HTTP GET UTF-8编码的支持, 打开D:\apache-tomcat-7.0.16\conf\server.xml,修成如下地方:
Xml代码

  • <Connectorport=&quot;8080&quot;protocol=&quot;HTTP/1.1&quot;   
  •                connectionTimeout=&quot;20000&quot;   
  •                redirectPort=&quot;8443&quot;URIEncoding=&quot;UTF-8&quot;/>
   3.2 配置solr的war包  
  在D:\apache-tomcat-7.0.16\conf\Catalina\localhost新建solr.xml,内容如下:
Xml代码

  • <ContextdocBase=&quot;F:/apache-solr-3.6.2.war&quot;debug=&quot;0&quot;crossContext=&quot;true&quot;>   
  •   <Environmentname=&quot;solr/home&quot;type=&quot;java.lang.String&quot;value=&quot;D:/hotel_solr&quot;override=&quot;true&quot;/>   
  • </Context>
   3.3 启动tomcat, 在浏览器中输入:http://localhost:8080/solr/   如果出现Admin core0表示正常。  4 准备酒店数据(如果没有自己去建立)
DSC0003.png
5 把数据库中的酒店数据添加到Solr索引库中
  使用Solrj客户端进行索引构建和查询,MAVEN依赖包:
Xml代码

  • <dependency>
  •       <groupId>junit</groupId>
  •       <artifactId>junit</artifactId>
  •       <version>3.8.1</version>
  •       <scope>test</scope>
  •     </dependency>
  •     <dependency>
  •         <groupId>org.apache.solr</groupId>
  •         <artifactId>solr-solrj</artifactId>
  •         <version>3.6.0</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>mysql</groupId>
  •         <artifactId>mysql-connector-java</artifactId>
  •         <version>5.1.19</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>commons-lang</groupId>
  •         <artifactId>commons-lang</artifactId>
  •         <version>2.6</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>org.apache.httpcomponents</groupId>
  •         <artifactId>httpclient</artifactId>
  •         <version>4.1.3</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>org.apache.httpcomponents</groupId>
  •         <artifactId>httpclient-cache</artifactId>
  •         <version>4.1.3</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>org.apache.httpcomponents</groupId>
  •         <artifactId>httpmime</artifactId>
  •         <version>4.1.3</version>
  •     </dependency>
  •     <dependency>
  •         <groupId>org.slf4j</groupId>
  •         <artifactId>slf4j-simple</artifactId>
  •         <version>1.6.4</version>
  •     </dependency>
Java代码

  • import java.sql.Connection;   
  • import java.sql.DriverManager;  
  • import java.sql.ResultSet;   
  • import java.sql.SQLException;  
  • import java.sql.Statement;   
  • import java.util.HashMap;   
  • import java.util.Map;   
  •   
  • import org.apache.commons.lang.StringUtils;  
  • import org.apache.solr.client.solrj.SolrRequest.METHOD;  
  • import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  • import org.apache.solr.client.solrj.response.QueryResponse;  
  • import org.apache.solr.common.SolrDocumentList;  
  • import org.apache.solr.common.SolrInputDocument;  
  • import org.apache.solr.common.params.MapSolrParams;  
  •   
  • public class App {  
  •   
  •     /**
  •      * 初始化索引数据
  •      * @param solrServer
  •      * @throws Exception
  •      */  
  •     public staticvoid buildIndex(String solrServer)throws Exception {  
  •         Connection connect = null;  
  •         Statement statement = null;  
  •         ResultSet resultSet = null;  
  •         HttpSolrServer server = null;  
  •         try {   
  •             Class.forName(&quot;com.mysql.jdbc.Driver&quot;);  
  •             connect = DriverManager   
  •                     .getConnection(&quot;jdbc:mysql://localhost/hotel_analysis?&quot;
  •                             &#43; &quot;user=root&password=11111&quot;);  
  •             statement = connect.createStatement();   
  •             resultSet = statement   
  •                     .executeQuery(&quot;select hotel_id,crawl_hotel_id,hotel_name,hotel_address,hotel_location from crawl_hotel&quot;);  
  •             server = new HttpSolrServer(solrServer);  
  •   
  •             int count = 0;   
  •   
  •             int eachCommit = 100;   
  •             //从数据库中获取酒店数据   
  •             while (resultSet.next()) {  
  •                 Integer hotel_id = resultSet.getInt(1);  
  •                 String crawl_hotel_id = resultSet.getString(2);  
  •                 String hotel_name = resultSet.getString(3);  
  •                 String hotel_address = resultSet.getString(4);  
  •                 String hotel_location = resultSet.getString(5);  
  •                 if (StringUtils.isBlank(hotel_location)) {  
  •                     continue;  
  •                 }   
  •                 count&#43;&#43;;   
  •                 //添加酒店数据到Solr索引中  
  •                 SolrInputDocument doc = new SolrInputDocument();  
  •                 doc.addField(&quot;hotel_id&quot;, hotel_id);  
  •                 doc.addField(&quot;crawl_hotel_id&quot;, crawl_hotel_id);  
  •                 doc.addField(&quot;name&quot;, hotel_name);  
  •                 doc.addField(&quot;address&quot;, hotel_address);  
  •                 doc.addField(&quot;latlng&quot;, hotel_location);  
  •                 server.add(doc);   
  •                 //100条commit一次  
  •                 if (count % eachCommit ==0) {  
  •                     server.commit();   
  •                     count = 0;  
  •                 }   
  •             }   
  •             if (count > 0) {   
  •                 server.commit();   
  •                 count = 0;  
  •             }   
  •         } finally {   
  •             if (null != resultSet) {  
  •                 try {   
  •                     resultSet.close();   
  •                 } catch (SQLException ex) {  
  •   
  •                 }   
  •             }   
  •             if (null != statement) {  
  •                 try {   
  •                     statement.close();   
  •                 } catch (SQLException ex) {  
  •   
  •                 }   
  •             }   
  •             if (null != connect) {  
  •                 try {   
  •                     connect.close();   
  •                 } catch (SQLException ex) {  
  •   
  •                 }   
  •             }   
  •         }   
  •     }   
  •     public staticvoid main(String[] args)throws Exception {  
  •         String URL = &quot;http://localhost:8080/solr/core0&quot;;  
  •         //构建索引到Solr库   
  •         buildIndex(URL);   
  •             //索引周边查询   
  •         //queryTest(URL);   
  •     }   
  •     /**
  •      * 测试索引查询
  •      * http://localhost:8080/solr/core0/select?q=*%3A*&fq=%7B%21geofilt%7D&pt=31.26552%2C121.460815&sfield=latlng&d=2&sort=geodist%28%29&#43;asc&fl=*%2Cscore&start=0&rows=10
  •      * @param solrServer
  •      * @throws Exception
  •      */  
  •     public staticvoid queryTest(String solrServer)throws Exception {  
  •         HttpSolrServer server = new HttpSolrServer(solrServer);  
  •         Map<String,String> params = new HashMap<String,String>();   
  •         params.put(&quot;q&quot;, &quot;*:*&quot;);   
  •         params.put(&quot;fq&quot;, &quot;{!geofilt}&quot;);//距离过滤函数
  •         params.put(&quot;pt&quot;, &quot;31.26552,121.460815&quot;);//当前经纬度
  •         params.put(&quot;sfield&quot;, &quot;latlng&quot;);//经纬度的字段
  •         params.put(&quot;d&quot;, &quot;2&quot;);//就近2公里的所有酒店   
  •         params.put(&quot;sort&quot;, &quot;geodist() asc&quot;);//根据距离排序
  •         params.put(&quot;fl&quot;, &quot;*,score&quot;);   
  •         params.put(&quot;start&quot;, &quot;0&quot;);//记录开始位置   
  •         params.put(&quot;rows&quot;, &quot;10&quot;);//查询的行数   
  •         QueryResponse resp = server.query(new MapSolrParams(params), METHOD.POST);  
  •         SolrDocumentList docs = resp.getResults();   
  •         for(int i=0;i<docs.size();i&#43;&#43;){  
  •             System.out.println(docs.get(i));   
  •         }   
  •     }   
  • }
  6 查询展示:
  
DSC0004.png

  查询结果页:
  
DSC0005.png

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138133-1-1.html 上篇帖子: Solr部署详解 下篇帖子: Solr4.4中配置multicore
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表