【Solr初探】Solr安裝,啟動,查詢,索引


1. 安裝&啟動

官網:http://lucene.apache.org/solr/

下載源代碼,解壓,進入根目錄(我把solr放在/usr/local/solr下

在/usr/local/solr/example中,有一些例子

啟動例子

bin/solr start –e cloud –noprompt


-e <example>  Name of the example to run; available examples:

      cloud:         SolrCloud example

      default:       Solr default example

      dih:           Data Import Handler

      schemaless:    Schema-less example

      multicore:     Multicore

-noprompt    對輸入不進行提示,接受所有默認輸入

  

另外一種啟動例子的方法

cd example
Java –jar start.jar
所有的日志會打印在控制台

在瀏覽器中輸入以下地址,打開solr管理界面

http://localhost:8983/solr

 

2. 使用工具快速索引文檔

以下命令均在命令行中完成,需要指定-classpath的,即指定solr-core-version.jar的路徑

(我的在/usr/local/solr/example目錄下執行

java -classpath dist/solr-c -Dauto -Drecursive org.apache.solr.util.SimplePostTool docs/

索引docs目錄下的所有文件(當前目錄/usr/local/solr/example)

java -Dauto -Drecursive org.apache.solr.util.SimplePostTool docs/

索引xml、json

在索引json時,需要指定 auto參數,因為SimplePostTool默認索引的是xml文檔

Because the SimplePostTool defaults to assuming files are in Solr XML format, the -Dauto switch is used to post JSON files so that it uses the appropriate content type.

java org.apache.solr.util.SimplePostTool example/exampledocs/*.xml
java -Dauto org.apache.solr.util.SimplePostTool example/exampledocs/books.csv
java -Dauto org.apache.solr.util.SimplePostTool example/exampledocs/books.json

使用post.jar索引文件

java -jar example/exampledocs/post.jar example/exampledocs/hd.xml

 

3. 停止solr、清空節點數據

bin/solr stop -all ; rm -Rf node1/ node2/

 

4. 使用SolrJ操作solr

4.1 安裝依賴包

SolrJ是一套操作solr的java API包,官網如下:

參考目錄:

http://wiki.apache.org/solr/Solrj

http://wiki.apache.org/solr/SolrQuerySyntax

使用SolrJ前,官網說明需要依賴如下包:

•	apache-solr-solrj-*.jar
•	commons-codec-1.3.jar
•	commons-httpclient-3.1.jar 
•	commons-io-1.4.jar
•	jcl-over-slf4j-1.5.5.jar 
•	slf4j-api-1.5.5.jar
•	slf4j-jdk14-1.5.5.jar

實際操作中,在IntelliJ IDEA中,編寫操作solr的代碼,需要的不止這幾個包,我的jar包如下:

•	solr-solrj-4.10.2.jar 
•	commons-codec-1.3.jar
•	commons-io-1.4.jar
•	jcl-over-slf4j.1.7.7.jar
•	slf4j-api-1.5.6.jar
•	slf4j-jdk14-1.5.6.jar
•	httpclient-4.3.1.jar 
•	httpcore-4.3.jar
•	httpmime-4.3.1.jar
•	noggit-0.5.jar

這里面有兩個坑:

  一:使用maven的pom.xml來管理包的時候,下載的包經常是不可用的(損壞),但是maven檢測不到。這個是我碰到的,最后是在solr安裝目錄下,搜索找到對應的jar包,手動添加的工程中。

  二:官網給的依賴包不太全,可能並不是針對獨立項目,這點我也不太明白,我自己試驗是有上面幾個包就夠了。

 

在嘗試使用solrJ可能使用的錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
	at solrX.IndexDataTools.main(IndexDataTools.java:115)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
	... 1 more

 上面的解法:添加httpclient-4.1.4.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/entity/mime/content/ContentBody
Caused by: java.lang.ClassNotFoundException: org.apache.http.entity.mime.content.ContentBody

上面的解法:添加 httpmime-4.2.3.jar

Exception in thread "main" java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
	at org.slf4j.LoggerFactory.staticInitialize(LoggerFactory.java:83)
	at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:73)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.<clinit>(HttpSolrServer.java:91)
	at solrX.IndexDataTools.main(IndexDataTools.java:115)

上面的解法:slf4j-api-1.5.6.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/noggit/CharArr
	at org.apache.solr.common.util.JavaBinCodec.<init>(JavaBinCodec.java:590)
	at org.apache.solr.client.solrj.impl.BinaryResponseParser.processResponse(BinaryResponseParser.java:43)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:528)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:210)
	at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:206)
	at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:124)
	at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:68)
	at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:54)
	at solr.data.tools.IndexDataTools.main(IndexDataTools.java:41)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.ClassNotFoundException: org.noggit.CharArr
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
	... 14 more

上面的解法:添加noggit-0.5.jar

 以上異常請同時參考:http://blog.sina.com.cn/s/blog_5ddc071f0101mtpf.html

4.2 Solrj 添加索引

SolrInputDocument:構造Solr文檔對象
在進行大數據索引時,最基礎的辦法就是依次構造該文檔對象,然后添加到solr中。

public static void main(String[] args) throws IOException, SolrServerException {
        String solrUrl = "http://localhost:8983/solr";
        HttpSolrServer server = new HttpSolrServer(solrUrl);
        server.setMaxRetries(1);
        server.setConnectionTimeout(5000);
        server.setSoTimeout(10000);
        server.setDefaultMaxConnectionsPerHost(100);
        server.setMaxTotalConnections(100);
        server.setFollowRedirects(false);
        server.setAllowCompression(true);

//        String url = server.getBaseURL();
        SolrInputDocument doc1 = new SolrInputDocument();
        doc1.addField( "id", "id1", 1.0f );
        doc1.addField( "name", "doc1", 1.0f );
        doc1.addField( "price", 10 );

        SolrInputDocument doc2 = new SolrInputDocument();
        doc2.addField( "id", "id2", 1.0f );
        doc2.addField( "name", "doc3", 1.0f );
        doc2.addField( "price", 20 );

        Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
        docs.add( doc1 );
        docs.add(doc2);


        server.add(docs);
        //*********************
        //set auto commit docs
//        UpdateRequest req = new UpdateRequest();
//        req.setAction( UpdateRequest.ACTION.COMMIT, false, false );
//        req.add( docs );
//        UpdateResponse rsp = req.process( server );
        //**********************
        server.commit();
}

4.3 查詢solr

SolrQuery: 構建solr查詢對象,設置查詢的屬性

QueryResponse: solr查詢結果對象

SolrDocumentList: solr查詢結果對象包含的結果對象

private String solrUrl = "http://localhost:8983/solr";
    public void querySolr(String queryStr) throws SolrServerException {
        HttpSolrServer server = new HttpSolrServer(solrUrl);


        SolrQuery query = new SolrQuery();
        query.setRequestHandler("/select");
        query.setQuery("name:doc*");
        query.setSort("id", SolrQuery.ORDER.asc);

        QueryResponse rsp = server.query(query);

        Iterator<SolrDocument> iter = rsp.getResults().iterator();
        SolrDocumentList docList = rsp.getResults();
        List<BooksItem> beans = rsp.getBeans(BooksItem.class);

        while(iter.hasNext()){
            SolrDocument doc = iter.next();
            String id  = (String)doc.getFieldValue("id");
            String name = (String)doc.getFieldValue("name");
            System.out.print(
                    "---id:"+id+"--name:"+name
            );
            Collection<String> names = doc.getFieldNames();
            for (String fName : names){
                java.lang.Object fValue = doc.getFieldValue(fName);
                boolean isString = fValue instanceof String;
                boolean isList = fValue instanceof ArrayList<?>;
                if (isString){
                    fValue = (String)fValue;
                    System.out.print("fieldName:"+fName+"  filedValue:"+fValue+"\n");
                }
                if (isList){
                    for (String s : (ArrayList<String>)fValue){
                        System.out.print("fieldName:"+fName+"  filedValue:"+String.valueOf(s)+"\n");
                    }
                }


            }

        }
    }

 

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM