- 本文內容: 在Android上使用SolrJ庫來連接Solr服務器檢索數據,主要問題就在Solrj使用的HTTPClient在Android上的匹配問題,Android項目的配置,其中遇到的坑比較多。
SolrJ是什么
SolrJ 是Solr 提供的Java API
相關資源
- Solr主頁
- Solr官方文檔下載 其中有SolrJ API說明
- SolrJ Wiki
Android 模塊 build.gradle 配置
主要有如下注意點:
- 需要添加packagingOptions 段
- 需要添加
useLibrary 'org.apache.http.legacy'
以啟用Apache HttpClient - 添加
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
使用此庫作為HTTPClient的實現,同時要排除solr-solrj
和httpmime
庫中會沖突的部分
android {
compileSdkVersion 24
buildToolsVersion '24.0.1'
//...... 省略其他配置
packagingOptions {
// 可能有多余的
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
}
//使用Apache HTTP 客戶端 ,因為android6.0 把這個移除了
useLibrary 'org.apache.http.legacy'
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// 省略其他配置
// 查詢依賴 :https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime/4.5.3
compile('org.apache.httpcomponents:httpmime:4.5.3') {
exclude module: 'httpclient'
}
//查詢依賴 :https://mvnrepository.com/artifact/org.apache.solr/solr-solrj/5.3.0
compile('org.apache.solr:solr-solrj:5.3.+') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
// httpcore 和 httpclient-android 有沖突
exclude group: 'org.apache.httpcomponents', module: 'httpcore'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
}
Java SolrJ測試代碼
HttpClient httpClient = new DefaultHttpClient();
// 設置超時時間 ,SolrClient 的用不了
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 2000);
SolrClient solrClient = new HttpSolrClient(mServiceUrl,httpClient );
SolrQuery query = makeSolrQuery(queryParams,-1,-1);
QueryResponse solrResponse = null;
try {
solrResponse = solrClient.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(solrResponse == null){
throw new Exception("查詢失敗");
}
private SolrQuery makeSolrQuery(String queryParams, int start, int rows) {
SolrQuery query = new SolrQuery(queryParams);
if(start >= 0){
query.set("start",start);
}
if(rows > 0) {
query.set("rows", rows);
}
query.set("timeAllowed",30*1000);//設置timeout 毫秒
return query;
}
相關問題日志關鍵詞:
- ERR: stack=java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/invoke/MethodHandles;
- NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser
- 使用SolrClient的設置timeout方法報錯: java.lang.VerifyError: Verifier rejected class org.apache.solr.client.solrj.impl.HttpClientUtil due to bad method org.apache.http.impl.client.CloseableHttpClient org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(org.apache.solr.common.params.SolrParams, org.apache.http.conn.ClientConnectionManager) (declaration of 'org.apache.solr.client.solrj.impl.HttpClientUtil'