solr就不多介紹了。是用于搜索功能的開源工具,很強大
?
一、solr環(huán)境部署
solr本身能夠用jetty啟動,但是還是用tomcat啟動比較適合我自己。學習solr有兩個星期了,到現在(2016.11.27)solr最新版已經是6.3.0了,不過沒關系,基本的東西都是一樣的。
1、solr官網:?http://lucene.apache.org/solr/
下載后解壓,是這樣的目錄結構:
2、solr當然可以直接按網上其他很多教程那樣整合到tomcat中,但是本人更喜歡建一個新工程,這樣更靈活。下面我們在eclipse中新建一個tomcat-solr的java web工程,不過這里要注意,要把這個工程的訪問路徑變成solr,不能是tomcat-solr,因為solr的管理頁面中,solr的開發(fā)者把這個目錄寫死了,我們要把訪問路徑改成solr,也就是:http://localhost:8080/solr/index.html ,怎么改呢:
在eclipse中:
?
下面我們進行如下操作:
1)將solr-6.2.1\server\solr-webapp\webapp下的內容copy到我們web工程的webapp下
2)將solr-6.2.1\server\lib\ext下的jar包,copy到我們的tomcat-solr功能中
3)將solr-6.2.1\server\resources\log4j.properties文件copy到tomcat-solr功能的src中,
4)在tomcat-solr工程的webapp文件夾下,新建文件夾solrhome,將solr-6.2.1\server\solr下的文件夾以及文件copy到solrhome中,
5)修改web.xml文件,修改env-entry-value的值為solrhome的絕對位置,如:
?6)啟動tomcat,訪問http://localhost:8080/solr/index.html
到此,solr部署完畢。
我們的tomcat-solr功能應該長得如此帥:
?
對了,solr支持zookeeper搭建集群配置,在這里我們先注釋掉,在solrhome文件夾下的solr.xml文件中,
?
Xml代碼??
<solr>?? <!--?注解掉zookeeper搭建集群配置,采用master-slave的形式?? ??<solrcloud>?? ?? ????<str?name="host">${host:}</str>?? ????<int?name="hostPort">${jetty.port:8983}</int>?? ????<str?name="hostContext">${hostContext:solr}</str>?? ?? ????<bool?name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>?? ?? ????<int?name="zkClientTimeout">${zkClientTimeout:30000}</int>?? ????<int?name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>?? ????<int?name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>?? ????<str?name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>?? ????<str?name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>?? ?? ??</solrcloud>?? ?? ??<shardHandlerFactory?name="shardHandlerFactory"?? ????class="HttpShardHandlerFactory">?? ????<int?name="socketTimeout">${socketTimeout:600000}</int>?? ????<int?name="connTimeout">${connTimeout:60000}</int>?? ??</shardHandlerFactory>?? -->?? </solr>?? ?
?
?
?二、core配置
solr的core非常重要,還有什么多core什么的,由于我也是剛剛學習,還沒有搞明白,這里只是能夠用最簡單的,我們將在solrhome文件夾下,新建文件夾:my_solr,然后將solr-6.2.1\example\example-DIH\solr\solr下的文件以及文件夾copy到my_solr下,
?
訪問剛才的地址:
?
三、整合mysql
1、首先我們在mysql中建個表作為練習,
?
Sql代碼??
CREATE?TABLE?`solrTest`?(?? ??`solrID`?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?'ID',?? ??`context`?varchar(255)?DEFAULT?NULL?COMMENT?'context',?? ??`updateTime`?datetime?DEFAULT?NULL?COMMENT?'updateTime',?? ??`sort`?int(11)?DEFAULT?'1'?COMMENT?'排序',?? ??PRIMARY?KEY?(`solrID`)?? )?DEFAULT?CHARSET=utf8;?? ?
2、將mysql的驅動jar包,copy到我們tomcat-solr功能中(lib文件夾下,這個們問題的吧),
3、修改my_solr文件夾下的conf文件夾下的solr-data-config.xml文件:
?
Xml代碼??
<dataConfig>?? ?? ??<dataSource?type="JdbcDataSource"??? ????driver="com.mysql.jdbc.Driver"??? ????url="jdbc:mysql://localhost:3306/test"??? ????user="root"??? ????password="123456"/>?? ?????? ??<document?name="solr_mysql_test">?? ????<entity?name="solrTest"??? ????????pk="solrID"??? ????????query="select?*?from?solrTest"??? ????????deltaImportQuery="select?*?from?solrTest?where?solrID?=?'${dih.delta.solrID}'"??? ????????deltaQuery="select?solrID?from?solrTest?where?updateTime?>?'${dataimporter.last_index_time}'"/>?? ?????????????? ??????<field?column="solrID"?name="solrID"/>???? ????<field?column="context"?name="context"/>???? ??????<field?column="updateTime"?name="updateTime"/>??? ??????<field?column="sort"?name="sort"/>??? ???????? ??</document>?? </dataConfig>?? ?這里面的內容具體什么意思,網上有很多專門介紹的文章博客,這里就不多說了
?
4、修改conf文件夾下的managed-schema文件,在schema標簽下添加field
?
Xml代碼??
<field?name="solrID"?type="string"?required="true"?indexed="true"?stored="true"?multiValued="false"/>?? <field?name="context"?type="string"?indexed="true"?stored="true"?multiValued="false"/>?? <field?name="updateTime"?type="date"?indexed="true"?stored="true"?multiValued="false"/>?? <field?name="sort"?type="int"?indexed="true"?stored="true"?multiValued="false"/>?? ?這里面name對應solr-data-config.xml中的name,要一直,否則solr就找不到字段了,
?
type是類型,indexed代表是否可用于檢索,stored代表是否存儲,multiValued代表是否有多個值,除此之外還有很多字段,讀者可以移步度娘。
(另外說一下,我這里用的其實是schema.xml,而不是managed-schema文件,不過感覺都是一個樣)
?
下面,看下我們的成就(別忘了mysql填點數據哦,否則啥也看不出來):
先刷新下solr數據:
?
然后查數據:
?
四、下面,我們看看中文分詞器
solr本分提供了很多分詞器(不過對中文的分詞實在不能用,憤怒!!!),對了,那么什么是分詞呢?比如“數據結構”這個詞,沒分詞前,solr就按“數據結構”這個詞查(有點像mysql的=),中文分詞后,就按“數據”,“結構”這兩個詞查(有點像like),這樣更符合我們的搜索習慣
有很多支持solr中文分詞的jar包,比如我們用的IKAnalyzer中文分詞器
我們首先導入IKAnalyzer的jar包,注意IKAnalyzer的jar包要與solr版本對應,否則會execption的,
然后在managed-schema文件的最后:
?
Xml代碼??
????? <fieldType?name="text_ik"?class="solr.TextField">?? ?????? ????<analyzer?type="index"?isMaxWordLength="false"?class="org.wltea.analyzer.lucene.IKAnalyzer"/>?? ?????? ????<analyzer?type="query"?isMaxWordLength="true"?class="org.wltea.analyzer.lucene.IKAnalyzer"/>?? </fieldType>?? ?在然后,比如我們數據庫表中的context字段要進行分詞,那么修改field:
?
?
Java代碼??
<field?name="context"?type="text_ik"?indexed="true"?stored="true"?multiValued="false"/>?? ?也就是修改type為分詞器的name
?
?
這時我們在去solr查詢一下,我們先填幾條數據:
?去看看成果:
?五、solrJ是連接我們java工程和solr的工具jar包,很實用
簡單的使用示例:
?
Java代碼??
public?class?SolrQueryTest?{?? ?????? ?????? ????public?static?final?String?solrServerUrl?=?"http://localhost:8080/solr";???? ?????? ?????? ????public?static?final?String?solrCroeHome?=?"my_solr";???? ?????? ????@SuppressWarnings({?"resource",?"deprecation"?})?? ????public?static?void?main(String[]?args)?{?? ????????try?{?? ?????????????? ?????????????? ?????????????? ????????????SolrClient?client?=?new?HttpSolrClient(solrServerUrl);?? ????????????QueryResponse?resp?=?client.query(solrCroeHome,?new?SolrQuery("*:*"));?? ????????????List<TestBean>?lists?=??resp.getBeans(TestBean.class);?? ????????????System.out.println(lists);?? ????????}?catch?(SolrServerException?e)?{?? ????????????e.printStackTrace();?? ????????}?catch?(IOException?e)?{?? ????????????e.printStackTrace();?? ????????}?? ????}?? }?? ?bean(注意要有solrJ的注解):
?
?
Java代碼??
public?class?TestBean?{?? ?? ????@Field("solrID")?? ????private?String?solrID;?? ?????? ????@Field("context")?? ????private?String?context;?? ?????? ????@Field("updateTime")?? ????private?Date?updateTime;?? ?? ????public?String?getSolrID()?{?? ????????return?solrID;?? ????}?? ?? ????public?void?setSolrID(String?solrID)?{?? ????????this.solrID?=?solrID;?? ????}?? ?? ????public?String?getContext()?{?? ????????return?context;?? ????}?? ?? ????public?void?setContext(String?context)?{?? ????????this.context?=?context;?? ????}?? ?? ????public?Date?getUpdateTime()?{?? ????????return?updateTime;?? ????}?? ?? ????public?void?setUpdateTime(Date?updateTime)?{?? ????????this.updateTime?=?updateTime;?? ????}?? ?? }?? ?solr在查詢時,也有很多方法,能夠設置查詢的條件,比如分頁、分片檢索、結果的過濾條件、排序等,下面只是一個示例,我一個功能的代碼片段:
?
?
Java代碼??
? ? ?? ???????solrQuery.setQuery(this.getQueryFields(keyWord));?????? ????????? ???????? ? ?? ???????solrQuery.setFilterQueries(this.getFielder(condition));?? ????????? ???????? ? ?? ???????solrQuery.setStart(pInteger);?? ???????solrQuery.setRows(systemConfigureUtil.getSolrRow());?? ?????? ???????? ? ?? ???????solrQuery.setFacet(systemConfigureUtil.isFacet());?? ???????solrQuery.add("facet.field",?systemConfigureUtil.getFacetStr());??? ?? ???????? ? ?? ???????solrQuery.add("fl",?systemConfigureUtil.getFilterFields());?? ????????? ???????? ? ?? ???????solrQuery.setSort(this.getSort(0));???? ???????solrQuery.addSort("sort",?SolrQuery.ORDER.desc);??? ?
?
到此,我學到的solr的東西也就這些了,還會繼續(xù)學習的。
?
我搭建好的tomcat-solr功能在我的github中:https://github.com/hejiawang/tomcat-solr
solrJ的練習工程:https://github.com/hejiawang/search-web
文章來源:http://hejiawangjava.iteye.com/blog/2341372
總結
以上是生活随笔為你收集整理的solr6.2从环境部署到与mysql整合到中文分词器到solrJ的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。