本文是我在開發過程當中遇到的一些問題的整理,有些摘自網上別人的方法。html
1. org.apache.solr.client.solrj.SolrServerException: Timeout occured while waiting response from server at: http://localhost/solr請求超時
解決方法:設置setConnectionTimeout和setSoTimeout爲1分鐘apache
2. org.apache.solr.common.SolrException: undefined field text
解決方法: 設置solrConfig.xml <str name="df">id</str> 默認是text性能
3. org.apache.solr.common.SolrException: Invalid Date String時間格式化問題
主要是Solr使用的是標準的格林威治(GMT)時間 這種(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')北京在東八區 默認時間會-8小時測試
因此爲了知足他這個減8 個人作法是在建立索引格式化日期類型的時候 判斷下 把它時間+8 。ui
因此從新建立一個SolrEntityBinder類 此類是徹底copy的DocumentObjectBinder. 只修改了一處。url
修改了類中toSolrInputDocument方法spa
- <span style="color:#3333ff;"> //判斷是不是日期-------------///
- if(field.type==Date.class){
- Date d = (Date)field.get(obj);
- Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(d.getTime());
- cal.add(Calendar.HOUR, 8);
- d = cal.getTime();
- doc.setField(field.name,d,1.0f);
- }else{
- doc.setField(field.name, field.get(obj), 1.0f);
- }</span>
4.Solr查詢字符串空值
有時候須要查詢某個字段爲空的記錄,好比當solr作facet時,某個域爲空的記錄被統計,故也會被查詢。
一個例子是職位記錄,其中某種緣由公司可能爲空。這時咱們若是想查詢公司名稱爲空的記錄能夠採用以下語法實現(彷佛目前爲止只有此方法可行):
-company:[* TO *] 這樣你會看到結果集中的記錄將含有全部公司名稱爲空的記錄。.net
5.Solr競價排名功能
假如你有3個doc想讓它們有競價排名,那就配這3個solr會把這3個放前面,而後是按照默認排序的其餘doc 。
參考wiki:http://wiki.apache.org/solr/QueryElevationComponent
6.Solr DisMax 分析
要用dismax,就必須啓用,在solr1.3之後,solr的dismax功能經過 DisMaxQParserPlugin 來解析了。
我測試的版本是3.3,是經過在查詢url裏添加defType=dismax來啓用dismax功能的。經過qt=dismax的話不會起做用的。
經過 defType=dismax 時,Solr 的QueryComponent組件的prepare的方法會取到defType參數的值,去建立對應的quey解析器。
你在查詢的條件裏面加上shards=localhost:9095/solr/core0,localhost:9095/solr/core1 。
solr 支持 *在第一位的搜索,只是性能很差,要掃描所有的倒排鏈。