Solr 是基於開放標准的,它是高度可擴展的。Solr 查詢是簡單的 HTTP 請求 URL,響應是一個結構化文檔:主要是 JSON,但也可以是 XML、CSV 或其他格式。這意味着各種各樣的客戶端將能夠使用 Solr,從其他 Web 應用程序到瀏覽器客戶端、豐富的客戶端應用程序和移動設備。任何能夠使用 HTTP 的平台都可以與 Solr 對話。
學習solr 除了官網文檔我們還可以看這邊的中午文檔:https://www.w3cschool.cn/solr_doc/solr_doc-ltzn2fm4.html
solr 默認是有web容器的 jetty ,我們也可以將它存放在tomcat 里面。
直接使用默認的話是可以直接啟動的,要使用tomcat 的話就比較麻煩點了。
由於tomcat 在企業應用較多,相對jetty 更為熟悉。所以我們這里使用的是tomcat進行搭建。
jetty 與tomcat 的對比
安裝 solr
下載solr(7.6版本) :
cd /opt wget http://mirrors.shu.edu.cn/apache/lucene/solr/7.6.0/solr-7.6.0.tgz
tar -xzf solr-7.6.0.tgz
配置solr 到tomcat(關鍵)
將solr 的webapp文件復制到tomcat的webapps目錄下並命名為solr
cp -r /opt/solr-7.6.0/server/solr-webapp /opt/tomcat-solr/webapps/solr
配置依賴包
將solr下 /ext 文件夾中 所有的jar 包復制到 tomcat 里的solr 目錄下的WEB-INF/lib 下
cp -r /opt/solr-7.6.0/server/lib/ext/ /opt/tomcat-solr/webapps/solr/WEB-INF/lib/
將solr下 server/lib/metrics開頭的jar包復制到 tomcat里的solr 目錄下的WEB-INF/lib 下
cp -r /opt/solr-7.6.0/server/lib/metrics*.jar /opt/tomcat-solr/webapps/solr/WEB-INF/lib/
創建tomcat solr 的 classes 文件
mkdir /opt/tomcat-solr/webapps/solr/WEB-INF/classes
復制 jetty-logging.properties,log4j2.xml 到 classes 文件夾下
cp /opt/solr-7.6.0/server/resources/jetty-logging.properties /opt/tomcat-solr/webapps/solr/WEB-INF/classes
cp /opt/solr-7.6.0/server/resources/log4j2.xml /opt/tomcat-solr/webapps/solr/WEB-INF/classes
創建 solr 的core 的主目錄(也就是存放core的位置)
cp -r /opt/solr-7.6.0/server/solr /opt/solrhome
修改配置文件指定solr的home
vim /opt/tomcat-solr/webapps/solr/WEB-INF/web.xml
添加以下內容:(注意第三行的值要替換成你們solr的home的絕對路徑)
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/opt/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
添加位置:
解決限制資源訪問
如果我們按照上面的配置好了,並啟動好了tomcat,那么我們直接去訪問我們的solr 會發現這個錯:
HTTP Status 403 - Access to the requested resource has been denied,拒絕我們的訪問資源請求。
解決辦法:
注釋
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
更改圖片位置
然后啟動tomcat ,我們訪問:http://ip:port/solr/index.html
啟動成功圖示:
遇到的問題以及解決辦法:
錯誤1
錯誤內容
Unable to resolve canonical hostname for local host,​ possible DNS misconfiguration. Set the 'solr.dns.prevent.reverse.lookup' sysprop to true on startup to prevent future lookups if DNS can not be fixed.
問題原因:
通過解析hostname 找不到對應的本地主機。原因是我更改了hostname,但是我沒有更改/etc/hosts 文件,你可以直接 ping 下主機名,看看是否能正常解析到127.0.0.1 。我的是不可以,所以這里報解析錯誤。
解決辦法:
編輯 /etc/hosts文件
在 127.0.0.1 和::1 后面添加 你的新主機名
示例: 我的主機名是ngrok
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ngrok
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ngrok
創建core
創建core 目錄
我這里的solr 的home目錄是 /opt/solrhome
mkdir /opt/solrhome/test1
添加配置文件
將配置文件復制到 test1 目錄下
cp /opt/solrhome/configsets/_default/conf/ /opt/solrhome/test1/
添加data目錄
用於存放數據
mkdir /opt/solrhome/test1/data/
添加core.properties 文件
name=test1 ,test1值換成你們core的名稱。
echo "name=test1" >/opt/solrhome/test1/core.properties
我們重新啟動就可以在 core 看到我們新加的目錄名稱了。
遇到的問題以及解決辦法:
錯誤一
錯誤內容
2019/1/9 上午11:01:16
WARN false x:ljf_dev SolrConfig Couldn't add files from /opt/solrhome/ljf_dev/../../../../contrib/extraction/lib filtered by .*\.jar to classpath: /opt/solrhome/ljf_dev/../../../../contrib/extraction/lib
2019/1/9 上午11:01:16
WARN falsex:ljf_dev SolrConfig Couldn't add files from /opt/solrhome/ljf_dev/../../../../dist filtered by solr-cell-\d.*\.jar to classpath: /opt/solrhome/ljf_dev/../../../../dist
錯誤原因
上面的錯誤是說加載不到那些jar包 ,上面的這些jar包還在我們解壓的文件里面,它肯定是找不到,我們先找到我們這個配置文件,然后修改它尋找的路徑。
配置文件是 core 目錄下的 conf 里的 solrconfig.xml
我們可以看到默認的配置路徑是: 這個路徑是solr的安裝路徑,我們可以更改成絕對路徑
<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />
解決辦法
將那些jar包放在一個固定路徑,然后更改配置文件里的路徑為絕對路徑
#備份下配置文件
cp /opt/solrhome/test1/conf/solrconfig.xml /opt/solrhome/test1/conf/solrconfig.xml.bak
#將依賴文件復制到 tomcat solr 下
cp -r /opt/solr-7.6.0/dist/ /opt/tomcat-solr/webapps/solr/
cp -r /opt/solr-7.6.0/contrib/ /opt/tomcat-solr/webapps/solr/
然后更改配置文件 /opt/solrhome/test1/conf/solrconfig.xml 修改為絕對路徑,下面為為修改后的。
<lib dir="/opt/tomcat-solr/webapps/solr/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="/opt/tomcat-solr/webapps/solr/dist/" regex="solr-velocity-\d.*\.jar" />
這樣重新啟動tomcat 就不會再有警告了。
配置分詞器
分詞器我們使用的是IK Analyzer
下載
下載鏈接 :百度雲盤 提取碼:i9uv(失效了評論區留言啊,我看到了會更新的)
添加依賴文件
下載好了后解壓上傳到服務器 :
有以下文件:
ext.dic # 詞典
IKAnalyzer.cfg.xml #配置文件
ik-analyzer-solr5-5.x.jar #jar包
solr-analyzer-ik-5.1.0.jar #jar包
stopword.dic # 詞典
我們需要將 jar 包放到 tomcat 下的solr 的WEB-INF/lib/ 下
將配置文件和詞典 移動到 到 tomcat 下的solr 的WEB-INF/classes 下
cp /tmp/ikanalyzer-solr5/*.dic IKAnalyzer.cfg.xml /opt/tomcat-solr/webapps/solr/WEB-INF/classes/
cp /tmp/ikanalyzer-solr5/*.jar /opt/tomcat-solr/webapps/solr/WEB-INF/lib/
core 配置
core 配置
編輯我們solr home 下的 core 目錄下conf里的managed-schema文件
vim /opt/solrhome/ljf_dev/conf/managed-schema
添加以下內容
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
添加后示圖:
使用分詞器。分詞合作共贏
不知道為啥,我總覺得這個分詞器有點不太准確。
擴展字典
vim /opt/tomcat-solr/webapps/solr/WEB-INF/classes/IKAnalyzer.cfg.xml
<properties>
<comment>IK Analyzer 擴展配置</comment>
<!--用戶可以在這里配置自己的擴展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
注意事項:
在tomcat 運行之初我看到了錯誤日志
Missing Java Option solr.log.dir. Logging may be missing or incomplete
針對這次錯誤:https://issues.apache.org/jira/browse/OFBIZ-9375
也未給出答案,但是上面說到這個是一個不影響使用報錯。
附加配置
core 添加字段
vim /opt/solrhome/test1/conf/managed-schema
<field name="age" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="info" type="text_ik" multiValued="false" indexed="true" stored="true"/>
<field name="name" type="string" multiValued="false" indexed="true" stored="true"/>
指定默認搜索字段
vim /opt/solrhome/test1/conf/solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<!-- 定義默認搜索字段 -->
<str name="df">info</str>
</lst>
</requestHandler>
配置數據源
vim /opt/solrhome/test1/conf/solrconfig.xml
添加以下內容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
並新建data-config.xml文件配置數據庫信息
data-config.xml 文件內容為:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="dataSource" type="JdbcDataSource"
driver="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://url:1433/database;useLOBs=false"
user="user"
password="password" />
<document>
<entity name="Table" dataSource="dataSource" pk="id"
query="SELECT * FROM Table">
<field column='id' name='id' />
<field column='name' name='name' />
<field column='age' name='age' />
<field column='info' name='info' />
</entity>
</document>
</dataConfig>
本地較多內容來自但其中錯誤及解決方法均本人自己撰寫:
https://blog.csdn.net/derlinchen/article/details/85719930
連接數據庫:(上面寫的不太完善)
https://blog.csdn.net/Amor_Leo/article/details/85256735