posts - 495,comments - 227,trackbacks - 0
          利用SOLR搭建企業(yè)搜索平臺(tái) 之一(運(yùn)行solr)

             在網(wǎng)絡(luò)上找了很多的關(guān)于solr的資料,發(fā)現(xiàn)非常的不全面,即使就是官方的wiki,也是如此!

            基于現(xiàn)階段正在研究的solr應(yīng) 用,陸續(xù)的會(huì)分享我的一些經(jīng)驗(yàn)!

            今天要說的是: 怎么跑起來!

            1》 首先下載好solr,我用的是 solr1.3,下載地址:

            windows版本

            http://labs.xiaonei.com/apache-m ... ache-solr-1.3.0.zip

            linux版本

            http://labs.xiaonei.com/apache-m ... ache-solr-1.3.0.tgz

            2》準(zhǔn)備運(yùn)行容器,我用的是tomcat6.0.20.如果是玩的話,也可以不用準(zhǔn) 備專門的容易,你只需解壓好solr的下載包,找到 example文件夾,然后運(yùn)行 start.jar。具體指令:java -jar start.jar做應(yīng)用的時(shí)候,不建議采用該方式。該方式內(nèi)部包含了jetty!

            3》有關(guān)tomcat的使用,不是本文的重點(diǎn),如 果你有問題,請(qǐng)參見tomcat的使用。解壓好tomcat,將solr包下面的dist文件夾中的apache-solr-1.3.0.war 拷貝到 tomcat的webapps,并且改名為 solr.war。

            4》新建一個(gè) solr-tomcat文件夾,我是把這個(gè)文件夾建立在C盤根目錄,你可以采用同樣方式,也可以不這樣,放哪由你決定。建立好該文件夾以后,在把它下面在 建立一個(gè)solr文件夾,把solr包里面的example\solr文件夾下面的所有文件放入到 solr里面。

            5》最后一步 配置 solr.home,可以有三種方式。

            1)基于當(dāng)前路徑的方式

            這種情況需要在c:\solr- tomcat\目錄下去啟動(dòng)tomcat,Solr查找./solr,因此在啟動(dòng)時(shí)候需要切換到c:\solr-tomcat\

            2) 基于環(huán)境變量

            windows在環(huán)境變量中建立solr.home,值為c:\solr-tomcat

            linux 在當(dāng)前用戶的環(huán)境變量中(.bash_profile)或在catalina.sh中添加如下環(huán)境變量

            export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"

             3)基于JNDI

            在tomcat的conf文件夾建立Catalina文件夾,然后在Catalina文件夾中在建立 localhost文件夾,在該文件夾下面建立solr.xml,其中內(nèi)容:

            Xml代碼   

          <Context  docBase="c:\tomcat\webapps\solr.war" debug="0" crossContext="true" >  
             <Environment name="solr/home" type="java.lang.String"  value="c:/solr-tomcat/solr" override="true" /> 
          </Context>

             問題描述:

            個(gè)人發(fā)現(xiàn)的一個(gè)問題,就是如果配置好JNDI的話,然后在tomcat的bin文件夾下面啟動(dòng) tomcat的話,會(huì)在tomcat的bin下面建立solr文件夾,這個(gè)文件夾中主要存放的索引文件。本來這些東西應(yīng)該放入c:\solr- tomcat\solr。如果你不想出現(xiàn)這種情況的話,請(qǐng)使用基于當(dāng)前路徑的方式。

            6》打開瀏覽器,請(qǐng)看看能否訪問該服務(wù)。如果能夠 訪問,恭喜您跑起來了。
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之二(中文分詞)

             這篇文章,主要說的是 怎么在solr中加入中文分詞,參考了一些文章,但是還是花了不少時(shí)間才搞出的。可能是大俠們太牛了,所以很多細(xì)節(jié)東西都沒有寫出來!但是要指出的是很多 文章都是抄來抄去的!

            入正題:

            在上面的一個(gè)文章中,已經(jīng)使solr跑起來了,在上面的基礎(chǔ)上,加入中文分詞。我 用的是paoding分詞器!

            1》請(qǐng)下好paoding分詞器,下載地址:

            http://code.google.com/p/paoding/downloads/list , 在這里要非常感謝paoding作者:qieqie

            在使用paoding的時(shí)候要注意:paoding的dic位置,也就是字典的位 置,有兩種辦法解決:                    

            1) 在系統(tǒng)環(huán)境變量中加入PAODING_DIC_HOME這個(gè)變量,值為paoding壓縮包下面的dic的解壓位置。

             2)paoding-analysis.jar里面有個(gè)paoding-dic-home.properties文件,指定dic也可,但是要重新編譯這 個(gè)jar包,我采用的后面一種辦法,只要每次固定好dic位置,部署還不是很不方便,設(shè)置環(huán)境變量我比較反感

            2》建立文件

             Java代碼  

          package com.yeedoo.slor.tokenizer; 
           
          import  java.io.Reader; 
          import java.util.Map; 
           
          import  net.paoding.analysis.analyzer.PaodingTokenizer; 
          import  net.paoding.analysis.analyzer.TokenCollector; 
          import  net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector; 
          import  net.paoding.analysis.analyzer.impl.MostWordsTokenCollector; 
          import  net.paoding.analysis.knife.PaodingMaker; 
           
          import  org.apache.lucene.analysis.TokenStream; 
          import  org.apache.solr.analysis.BaseTokenizerFactory; 
           
          public class  ChineseTokenizerFactory extends BaseTokenizerFactory { 
           
           /** 
            * 最多切分 默認(rèn)模式 
           */ 
           public static final String MOST_WORDS_MODE =  "most-words"; 
           
           /** 
           * 按最大切分 
           */ 
           public static  final String MAX_WORD_LENGTH_MODE = "max-word-length"; 
           
           private  String mode = null; 
           
           public void setMode(String mode) { 
            if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) ||  "default".equalsIgnoreCase(mode)) { 
            this.mode = MOST_WORDS_MODE; 
            } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) { 
             this.mode = MAX_WORD_LENGTH_MODE; 
           } else { 
            throw new  IllegalArgumentException("不合法的分析器Mode參數(shù)設(shè)置:" + mode); 
           } 
           } 
           
            @Override 
           public void init(Map<String,String> args) { 
            super.init(args); 
           setMode(args.get("mode").toString()); 
           } 
           
            public TokenStream create(Reader input) { 
           return new  PaodingTokenizer(input, PaodingMaker.make(), createTokenCollector()); 
            } 
           
           private TokenCollector createTokenCollector() { 
           if  (MOST_WORDS_MODE.equals(mode)) 
            return new  MostWordsTokenCollector(); 
           if (MAX_WORD_LENGTH_MODE.equals(mode)) 
             return new MaxWordLengthTokenCollector(); 
           throw new Error("never  happened"); 
           } 
           
          }
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之三(配置文件)

             運(yùn)行solr是個(gè)很簡(jiǎn)單的事,如何讓solr高效運(yùn)行你的項(xiàng)目,這個(gè)就不容易了。要考慮的因素太多。這里很重要一個(gè)就是對(duì)solr的配置要了解。懂得配 置文件每個(gè)配置項(xiàng)的含義,這樣操作起來就會(huì)如魚得水!

            在solr里面主要的就是solr的主目錄下面的 schema.xml,solrConfig.xml,如果你看過前兩篇文章的話,你應(yīng)該知道solr的主目錄處于什么位置(c:\solr- tomcat\solr\conf\)。

            在這個(gè)文章中,我們首先來說說這個(gè)schema.xml。

             schema.xml,這個(gè)相當(dāng)于數(shù)據(jù)表配置文件,它定義了加入索引的數(shù)據(jù)的數(shù)據(jù)類型的。主要包括types、fields和其他的一些缺省設(shè)置。

             1》首先需要在types結(jié)點(diǎn)內(nèi)定義一個(gè)FieldType子結(jié)點(diǎn),包括name,class,positionIncrementGap等等一些參 數(shù),name就是這個(gè)FieldType的名稱,class指向org.apache.solr.analysis包里面對(duì)應(yīng)的class名稱,用來定義 這個(gè)類型的行為。在FieldType定義的時(shí)候最重要的就是定義這個(gè)類型的數(shù)據(jù)在建立索引和進(jìn)行查詢的時(shí)候要使用的分析器analyzer,包括分詞和 過濾。在例子中text這個(gè)FieldType在定義的時(shí)候,在index的analyzer中使用 solr.WhitespaceTokenizerFactory這個(gè)分詞包,就是空格分詞,然后使用 solr.StopFilterFactory,solr.WordDelimiterFilterFactory,solr.LowerCaseFilterFactory,solr.EnglishPorterFilterFactory,solr.RemoveDuplicatesTokenFilterFactory 這幾個(gè)過濾器。在向索引庫中添加text類型的索引的時(shí)候,Solr會(huì)首先用空格進(jìn)行分詞,然后把分詞結(jié)果依次使用指定的過濾器進(jìn)行過濾,最后剩下的結(jié)果 才會(huì)加入到索引庫中以備查詢。Solr的analysis包并沒有帶支持中文的包,在第二篇文章中詳細(xì)講了怎樣添加paoding中文分詞器,詳情請(qǐng)參見http://lianj-lee.javaeye.com/blog/424474

             2》接下來的工作就是在fields結(jié)點(diǎn)內(nèi)定義具體的字段(類似數(shù)據(jù)庫中的字段),就是filed,filed定義包括name,type(為之前定義 過的各種FieldType),indexed(是否被索引),stored(是否被儲(chǔ)存),multiValued(是否有多個(gè)值)等等。

             例:

            Xml代碼   

          <fields> 
           <field name="id"  type="integer" indexed="true" stored="true" required="true" /> 
            <field name="name" type="text" indexed="true" stored="true" /> 
            <field name="summary" type="text" indexed="true" stored="true" /> 
            <field name="author" type="string" indexed="true" stored="true" />  
           <field name="date" type="date" indexed="false" stored="true"  /> 
           <field name="content" type="text" indexed="true"  stored="false" /> 
           <field name="keywords" type="keyword_text"  indexed="true" stored="false" multiValued="true" /> 
           <field  name="all" type="text" indexed="true" stored="false"  multiValued="true"/> 
          </fields>

            field的定義相當(dāng)重要,有幾個(gè)技巧需 注意一下,對(duì)可能存在多值得字段盡量設(shè)置multiValued屬性為true,避免建索引是拋出錯(cuò)誤;如果不需要存儲(chǔ)相應(yīng)字段值,盡量將stored屬 性設(shè)為false。

            3》建議建立了一個(gè)拷貝字段,將所有的全文字段復(fù)制到一個(gè)字段中,以便進(jìn)行統(tǒng)一的檢索:

             Xml代碼

          <field name="all" type="text" indexed="true"  stored="false" multiValued="true"/>

            并在拷貝字段結(jié)點(diǎn)處完成拷貝設(shè)置:

             Xml代碼 <copyField source="name" dest="all"/> 
          <copyField  source="summary" dest="all"/>

            4》除此之外,還可以定義動(dòng)態(tài)字段,所謂動(dòng)態(tài)字段就是不用指定具 體的名稱,只要定義字段名稱的規(guī)則,例如定義一個(gè) dynamicField,name 為*_i,定義它的type為text,那么在使用這個(gè)字段的時(shí)候,任何以_i結(jié)尾的字段都被認(rèn)為是符合這個(gè)定義的,例 如:name_i,gender_i,school_i等。
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之四(MultiCore)
            Solr Multicore 是 solr 1.3 的新特性。其目的一個(gè)solr實(shí)例,可以有多個(gè)搜索應(yīng)用。

             下面著手來將solr給出的一個(gè)example跑出來,在《利用SOLR搭建企業(yè)搜索平臺(tái) 之一(運(yùn)行solr)》這篇文章里面已經(jīng)講了怎樣來運(yùn)行solr,這篇文章是基于《利用SOLR搭建企業(yè)搜索平臺(tái) 之一(運(yùn)行solr)》,有不明白的請(qǐng)參見http://lianj-lee.javaeye.com/blog/424383

            1》 找到solr下載包中的example文件夾,在它的下面有個(gè)multicore文件夾,將這個(gè)文件夾下面的所有東西copy到 c:\solr-tomcat\solr下面。

            注意:有一個(gè) solr.xml(這只是默認(rèn)文件,當(dāng)然也可以指定別的文件),如:

             Xml代碼   

          <?xml version="1.0" encoding="UTF-8" ?>  
            <solr persistent="false">   
            <cores  adminPath="/admin/cores">  
             <core name="core0"  instanceDir="core0" />  
             <core name="core1"  instanceDir="core1" />  
            </cores>  
           </solr> 

             這個(gè)文件是告訴solr應(yīng)該加載哪些core,cores里有 core0,core1。core0(可以類比以前的solr.home)/conf目錄下有schema.xml與solrconfig.xml,可以 把實(shí)際應(yīng)用的復(fù)制過來。現(xiàn)示例就用官方的了。

            2》啟動(dòng)tomcat,訪問應(yīng)用,就可以看到有 Admin core0 和 Admin core1

            3》采用上面的默認(rèn)solr.xml,索引文件將存放在同一個(gè)目錄下面,在這里將存放在C:\solr- tomcat\solr\data,如果你想更改目錄,或者兩個(gè)應(yīng)用存放在不同的目錄,請(qǐng)參見下面的xml。

            Xml代碼

          <core  name="core0" instanceDir="core0"> 
            <property name="dataDir"  value="/data/core0" /> 
           </core>

            給core添加子元素 property,property的兩個(gè)屬性就不說了,一看就能明白!

            solr.core.name -- The core's name as defined in solr.xml

            solr.core.instanceDir -- The core's instance directory (i.e. the directory under which that core's conf/ and data/ directory are located)

            solr.core.dataDir -- The core's data directory (i.e. the directory under which that core's index directory are located)

            solr.core.configName -- The name of the core's config file (solrconfig.xml by default)

             solr.core.schemaName -- The name of the core's schema file (schema.xml by default)

            4》solr.xml具體含義:

            1)solr

            The <solr> tag accepts two attributes:

            persistent - By default, should runtime core manipulation be saved in solr.xml so that it is available after a restart.

            sharedLib - Path to a directory containing .jar files that are added to the classpath of every core. The path is relative to solr.home (where solr.xml sits)

             2)cores

            The <cores> tag accepts two attribute:

             adminPath - Relative path to access the CoreAdminHandler for dynamic core manipulation. For example, adminPath="/admin/cores" configures access via  http://localhost:8983/solr/admin/cores . If this attribute is not specified, dynamic manipulation is unavailable.

             3)core

            The <core> tag accepts two attributes:

             name - The registered core name. This will be how the core is accessed.

             instanceDir - The solr.home directory for a given core.

             dataDir - The data directory for a given core. The default is <instanceDir>/data . It can take an absolute path or a relative path w.r.t instanceDir .  Solr1.4

            4)property

            The <property> tag accepts two attributes:

            name - The name of the property

            value - The value of the property

            由于E文過于 簡(jiǎn)單,所以就不翻譯了!
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之五(solrj)

             相信很多人,在準(zhǔn)備提交數(shù)據(jù)讓solr建立索引的那刻,很納悶,盡管看了不少網(wǎng)上的一些文章,但是我想依然還是有不少不理解的地方。

             比如提交一個(gè)xml,采用post方式,盡管有些文章說了可以采用httpclient。但是我那個(gè)時(shí)候,還不是很理解,當(dāng)然現(xiàn)在看來其實(shí)也沒有什么 了。但是對(duì)于一個(gè)剛?cè)腴Tsolr的初學(xué)者,我想講講關(guān)于solr1.3的 solrj( sorlr J 目前使用二進(jìn)制的格式作為默認(rèn)的格式。對(duì)于solr1.2的用戶通過顯示的設(shè)置才能使用XML格式。)!

            先上一個(gè)例子:

             Java代碼

          public static final String SOLR_URL = "http://localhost/solr/core0 ";  
          public static void commit() { 
           Date date = new Date(); 
            SolrServer solr = null; 
           try { 
           solr = new  CommonsHttpSolrServer(SOLR_URL); 
           } catch (MalformedURLException e1)  { 
           e1.printStackTrace(); 
           } 
          for (int i = 0; i < 10000;  i++) { 
            SolrInputDocument sid = new SolrInputDocument(); 
             sid.addField("id", i); 
            sid.addField("name",  "struts+hibernate+spring 開發(fā)大全" + i); 
            sid.addField("summary", "三種框架 的綜合應(yīng)用" + i); 
            sid.addField("author", "李良杰" + i); 
             sid.addField("date", new Date()); 
            sid.addField("content", "高級(jí)應(yīng)用類書 籍" + i); 
            sid.addField("keywords", "SSH" + i); 
            try { 
             solr.add(sid); 
            } catch (MalformedURLException e) { 
             e.printStackTrace(); 
            } catch (SolrServerException e) { 
             e.printStackTrace(); 
            } catch (IOException e) { 
             e.printStackTrace(); 
            } 
            System.out.println(i); 
            if (i ==  999) 
            System.out.println((new Date().getTime() - date.getTime()) /  60000 + "分鐘"); 
           } 
           try { 
            solr.commit(); 
           } catch  (SolrServerException e) { 
            e.printStackTrace(); 
           } catch  (IOException e) { 
            e.printStackTrace(); 
           } 
          }
           
           
           
            上面這段代碼的意思是:利用for提交10000 個(gè)document,并打印提交10000所需的時(shí)間。

            1》CommonsHttpSolrServer 使用HTTPClient 和solr服務(wù)器進(jìn)行通信。

            2》CommonsHttpSorlrServer 允許設(shè)置鏈接屬性。

            Java 代碼

          server.setSoTimeout(1000); // socket read timeout  
            server.setConnectionTimeout(100);  
            server.setDefaultMaxConnectionsPerHost(100);  
            server.setMaxTotalConnections(100);  
            server.setFollowRedirects(false); // defaults to false  
           //  allowCompression defaults to false.  
           // Server side must support  gzip or deflate for this to have any effect.  
            server.setAllowCompression(true);  
           server.setMaxRetries(1); //  defaults to 0. > 1 not recommended. 

            3》實(shí)現(xiàn)SolrServer接口的另一個(gè) 類:EmbeddedSorrServer,它不需要http連接。

            4》在構(gòu)造document的時(shí)候,可以一個(gè)一個(gè)添加到 solrServer,也可以構(gòu)建一個(gè)包含document的Collection,將Collection添加到solrServer,然后 commit。

            5》也可以構(gòu)造一個(gè)跟document匹配的JavaBean進(jìn)行提交

            使用 java 注釋創(chuàng)建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一個(gè)域的名稱跟bean的名稱是不一樣的,那么在java注釋中填寫別名,具體的,可以參照下面的域 categories         

            Java代碼    

          import  org.apache.solr.client.solrj.beans.Field;  
           public class Item {  
             @Field  
            String id;  
            @Field("cat")  
            String[]  categories;  
            @Field  
            List<String> features;  
           } 
           
           
            java注釋也可以使用在setter方法上,如 下面的例子:

            Java代碼

          @Field("cat")  
           public void  setCategory(String[] c){  
             this.categories = c;  
           } 

             這里應(yīng)該要有一個(gè)相對(duì)的,get方法(沒有加java注釋的)來讀取屬性

            Java代碼

          Item item =  new Item();  
          item.id = "one";  
          item.categories = new String[] {  "aaa", "bbb", "ccc" }; 

            添加給solr         

            Java代碼

          server.addBean(item);  

            將多個(gè)bean提交給solr

            Java代碼

          List<Item> beans  ;  
          //add Item objects to the list  
          server.addBeans(beans);    

             注意: 你可以重復(fù)使用SolrServer,這樣可以提高性能。

            6》

            Java代碼

          public  static void update() { 
           SolrServer solrServer = null; 
           try { 
            solrServer = new CommonsHttpSolrServer(SOLR_URL); 
           } catch  (MalformedURLException e) { 
           e.printStackTrace(); 
           } 
            UpdateRequest updateRequest = new UpdateRequest(); 
            SolrInputDocument sid = new SolrInputDocument(); 
           sid.addField("id",  100000); 
           sid.addField("name", "struts+hibernate+spring 開發(fā)大全"); 
            sid.addField("summary", "三種框架的綜合應(yīng)用"); 
           sid.addField("author", "李良 杰"); 
           sid.addField("date", new Date()); 
           sid.addField("content",  "高級(jí)應(yīng)用類書籍"); 
           sid.addField("keywords", "SSH"); 
            updateRequest.setAction(UpdateRequest.ACTION.COMMIT, false, false);  
            updateRequest.add(sid);  
           try { 
           UpdateResponse updateResponse =  updateRequest.process(solrServer); 
            System.out.println(updateResponse.getStatus()); 
           } catch  (SolrServerException e) { 
           e.printStackTrace(); 
           } catch  (IOException e) { 
           e.printStackTrace(); 
           } 
          }
           
           
           
            提交一個(gè)document,采用更新方式,注意:

             Java代碼

          updateRequest.setAction(UpdateRequest.ACTION.COMMIT,  false, false);

            7》

            Java代碼

          public static void  query() { 
           SolrServer solr = null; 
           try { 
           solr = new  CommonsHttpSolrServer(SOLR_URL); 
           } catch (MalformedURLException e)  { 
           e.printStackTrace(); 
           return; 
           } 
           // http://localhost:8983/solr/spellCheckCompRH?q=epod&spellcheck=on&spellcheck.build=true  
            ModifiableSolrParams params = new ModifiableSolrParams(); 
            params.set("qt", "/spellCheckCompRH"); 
           params.set("q", "編程"); 
            params.set("spellcheck", "on"); 
           params.set("spellcheck.build",  "true"); 
           QueryResponse response = null; 
           try { 
           response =  solr.query(params); 
           } catch (SolrServerException e) { 
            e.printStackTrace(); 
           return; 
           } 
            System.out.println("response = " + response); 
          }

            這是一個(gè)查詢方法。關(guān)鍵 字:“編程”。關(guān)于查詢的關(guān)鍵字,請(qǐng)參見slor wiki http://wiki.apache.org/solr/QueryParametersIndex , 或等待我的博客更新,在后面會(huì)有篇文章詳細(xì)講這個(gè)問題!

            8》給solr的索引文件手動(dòng)進(jìn)行優(yōu)化,

          solr.optimize();

             9》solrJ 提供了一組API,來幫助我們創(chuàng)建查詢,下面是一個(gè)faceted query的例子。

          SolrServer  server = getSolrServer();  
          SolrQuery  solrQuery = new  SolrQuery().setQuery("ipod").setFacet(true).setFacetMinCount(1).setFacetLimit(8).    addFacetField("category").addFacetField("inStock");   
          QueryResponse  rsp = server.query(solrQuery); 

            所有的 setter/add 方法都是返回它自己本身的實(shí)例,所以就像你所看到的一樣,上面的用法是鏈?zhǔn)降摹?/div>
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之六(solr查詢參數(shù)說明)

            在做solr查詢的時(shí)候,solr提供了很多參數(shù)來擴(kuò)展它自身的強(qiáng)大功能!以下是使用頻率最高的一些參 數(shù)!

            具體請(qǐng)看:

            1.常用

            q - 查詢字符串,必須的。查詢語句(類似SQL) 相關(guān)詳細(xì)的操作還需lucene 的query 語法

            fl - 指定返回那些字段內(nèi)容,用逗號(hào)或空格分隔多個(gè)。

             start - 返回第一條記錄在完整找到結(jié)果中的偏移位置,0開始,一般分頁用。

            rows - 指定返回結(jié)果最多有多少條記錄,配合start來實(shí)現(xiàn)分頁。

            sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默認(rèn)是相關(guān)性降序。

             wt - (writer type)指定輸出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我們,因?yàn)槟J(rèn)沒有打開。

            fl表示索引顯示那些field(*表示所有field, score 是solr 的一個(gè)匹配熱度)

            q.op 表示q 中 查詢語句的 各條件的邏輯操作 AND(與) OR(或)

            hl 是否高亮

            hl.fl 高亮field

            hl.snippets 不太清楚(反正是設(shè)置高亮3就可以了)

             hl.simple.pre 高亮前面的格式

            hl.simple.post 高亮后面的格式

            facet 是否啟動(dòng)統(tǒng)計(jì)

            facet.field  統(tǒng)計(jì)field

            fq - (filter query)過慮查詢,作用:在q查詢符合結(jié)果中同時(shí)是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關(guān)鍵字mm,并且date_time是20081001到20091031之間的。官方文檔:http://wiki.apache.org/solr/Comm ... ec487758577506d6002

            2.不常用

            q.op - 覆蓋schema.xml的defaultOperator(有空格時(shí)用"AND"還是用"OR"操作邏輯),一般默認(rèn)指定

            df - 默認(rèn)的查詢字段,一般默認(rèn)指定

            qt - (query type)指定那個(gè)類型來處理查詢請(qǐng)求,一般不用指定,默認(rèn)是standard。

            3.其它

            indent - 返回的結(jié)果是否縮進(jìn),默認(rèn)關(guān)閉,用 indent=true|on 開啟,一般調(diào)試json,php,phps,ruby輸出才有必要用這個(gè)參數(shù)。

             version - 查詢語法的版本,建議不使用它,由服務(wù)器指定默認(rèn)值。
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之七(solr使用問題集)

            某日,突發(fā)奇想,想寫這么一個(gè)博客,希望記錄下所有在solr中使用的毛病。而且我希望廣大的看友們也能 一起來說說你們平時(shí)遇到的各種錯(cuò)誤,這樣大家才能一起更好的進(jìn)步!

            話不多說,進(jìn)入正題

            1》solr 做索引時(shí)報(bào) Lock obtain timed out: SingleInstanceLock: write.lock

            有個(gè)頻繁做索引的 應(yīng)用,它同時(shí)也對(duì)外提供搜索服務(wù)。大部分是 solr 1.3 的默認(rèn)配置。solr 做索引,有時(shí)候報(bào):

            Xml代碼

          2009-7-13  9:48:06 org.apache.solr.common.SolrException log 
          嚴(yán)重:  org.apache.lucene.store.LockObtainFailedException: Lock obtain timed  out: SingleInstanceLock: write.lock 
              at  org.apache.lucene.store.Lock.obtain(Lock.java:85) 
              at  org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1140) 
               at org.apache.lucene.index.IndexWriter.<init> (IndexWriter.java:938) 
              at  org.apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.java:116)  
          ...

            是寫鎖取不到。但重啟 solr 又可以正常做,主要是運(yùn)行時(shí)間長(zhǎng)了就報(bào)這個(gè)錯(cuò)了。還是看下配置吧。

             看到 solr 1.3 默認(rèn)的配置是:

            Xml代碼

          <indexDefaults>  
             <!-- ... -->  
            <!--  
             This option specifies which  Lucene LockFactory implementation to use.  
            
             single =  SingleInstanceLockFactory - suggested for a read-only index  
                   or when there is no possibility of another process trying  
                   to modify the index.  
             native = NativeFSLockFactory  
             simple  = SimpleFSLockFactory  
            
             (For backwards compatibility with  Solr 1.2, 'simple' is the default  
              if not specified.)  
             -->  
            <lockType>single</lockType>  
          </indexDefaults>  
           
           
            默認(rèn)鎖是 single ,只讀的。solr 1.2 是 simple,把它改回去了,運(yùn)行了幾天,沒事。

            2》lucene & solr optimize 索引后結(jié)果與平臺(tái)有點(diǎn)關(guān)系

            昨日做索引的程序重構(gòu)下,測(cè)試 optimize 索引(在原有數(shù)據(jù)基礎(chǔ)上提交索引)時(shí),在開發(fā)的機(jī)器(windows)里總是會(huì)有兩段索引,要再 optimize 才只是一個(gè)索引段,當(dāng)然不是設(shè)置 maxSegments=2。反復(fù)運(yùn)行還是如此,為了說明是否寫的程序有問題,就用 solr 自帶的 post.sh (或 post.jar)提交 optimize。結(jié)果還是有兩段,再提交一次optimize 才是一個(gè)段。這問題……

            舊的程序運(yùn)行得很正常,看了下它也沒有提交 兩次優(yōu)化。然后把新的程序也放到服務(wù)器(linux)上運(yùn)行,結(jié)果是只有一個(gè)段。

            恩,可以認(rèn)為是與文件系統(tǒng)有關(guān),optimize 的時(shí)候是先新生成一段,然后再刪除舊的索引,windows 可能是這樣在運(yùn)行期間與文件關(guān)聯(lián)著刪除不了舊的。linux 可能是不用(不打開)文件就可以刪除。現(xiàn)只能這樣簡(jiǎn)單解釋。

            3》換 solr 里的 lucene 包

            solr 1.3 發(fā)布的時(shí)候,lucene 2.4還沒有正式發(fā)布,其的 lucene 是開發(fā)版,現(xiàn)在lucene 2.4早已發(fā)布,那就換上新的 lucene 吧。

            下載 solr 1.3 http://labs.xiaonei.com/apache-m ... ache-solr-1.3.0.zip 和 lucene 2.4 http://labs.xiaonei.com/apache-m ... va/lucene-2.4.0.zip 到目錄如e:/search/,

            把 e:/search/apache-solr-1.3/lib 目錄下的 lucene 相關(guān)的*.jar刪除:

             lucene-analyzers-2.4-dev.jar

            lucene-core-2.4-dev.jar

             lucene-highlighter-2.4-dev.jar

            lucene-memory-2.4-dev.jar

             lucene-queries-2.4-dev.jar

            lucene-snowball-2.4-dev.jar

             lucene-spellchecker-2.4-dev.jar

            從 e:/search/lucene-2.4/(或contrib/)目錄下找到對(duì)應(yīng)的放到solr-1.3/lib下

            然后構(gòu)建 solr,到e:/search/apache-solr-1.3目錄,ant dist-war

            4》solr q查詢?nèi)蒎e(cuò)性

             當(dāng)solr接收沒q參數(shù)(或q參數(shù)值為空)請(qǐng)求時(shí),會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)十分討厭,對(duì)開發(fā)調(diào)試時(shí)才比較有用,但實(shí)際運(yùn)行環(huán)境報(bào)錯(cuò)就不太好了,java異常可能有 點(diǎn)性能消耗,那干脆就返回正常的結(jié)果好了(只是結(jié)果里沒有找到的數(shù)據(jù))。

            solr 1.3 可以寫個(gè)組件去做。判斷到空的時(shí)候,加一個(gè)q參數(shù),其值為在索引里沒有的數(shù)據(jù)。這樣就可以返回沒有數(shù)據(jù)的結(jié)果。

            其實(shí)這樣實(shí)現(xiàn)還是比較 麻煩。可以在 solrconfig.xml的requestHandler里加一個(gè)默認(rèn)參數(shù)。如q=abcdefghijk。配置如下:

             Xml代碼

          <requestHandler name="standard"  class="solr.SearchHandler" default="true">  
            <lst  name="defaults">  
             <str name="q">abcdefghijk</str>   
            </lst>  
          </requestHandler> 

            這樣的話查詢?nèi)蒎e(cuò)性比較好, 查詢請(qǐng)求沒有帶q參數(shù)也可,q參數(shù)值為空也可。tomcat不會(huì)報(bào)錯(cuò),還可以返回結(jié)果。
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之八(solr 實(shí)現(xiàn)去掉重復(fù)的搜索結(jié)果,打SOLR-236_collapsing.patch補(bǔ)丁

            引用Bory.Chanhttp://blog.chenlb.com/2009/04/a ... plicate-result.html

            打上SOLR-236_collapsing.patch補(bǔ)丁,實(shí)現(xiàn) solr 搜索結(jié)果折疊、除去重復(fù)的搜索結(jié)果,可以實(shí)現(xiàn)類似google搜索結(jié)果的“站內(nèi)的其它相關(guān)信息 ”。solr collapsing patch 是用 hash 某個(gè)字段來實(shí)現(xiàn)折疊重復(fù)結(jié)果的。下面我演示下應(yīng)用這個(gè)補(bǔ)丁并搜索試用下。

            其實(shí) solr 上已經(jīng)有了這功能的實(shí)現(xiàn):solr 1.3 collapse patch, 請(qǐng)看:https://issues.apache.org/jira/browse/SOLR-236 , 我這里下載是了新的:https://issues.apache.org/jira/s ... 36_collapsing.patch

            下載好后就需要打上補(bǔ)丁了,先準(zhǔn)備一份源碼在D:/apache-solr- 1.3.0目錄下。沒有可以去下載:http: //archive.apache.org/dist/lucene/solr/1.3.0/apache-solr-1.3.0.zip。把SOLR- 236_collapsing.patch文件放在D:/apache-solr-1.3.0目錄下, 打補(bǔ)丁有我知道的有兩種:用linux工具 patch(windows 下有 cygwin);用 ant 的 patch。

            windows cygwin 的 patch:

             Html代碼

          D:\apache-solr-1.3.0>patch -p0 <  SOLR-236_collapsing.patch 
          patching file  src/test/org/apache/solr/search/TestDocSet.java 
          patching file  src/java/org/apache/solr/search/CollapseFilter.java 
          patching file  src/java/org/apache/solr/search/DocSet.java 
          patching file  src/java/org/apache/solr/search/NegatedDocSet.java 
          patching file  src/java/org/apache/solr/search/SolrIndexSearcher.java 
          patching file  src/java/org/apache/solr/common/params/CollapseParams.java 
          patching  file src/java/org/apache/solr/handler/component/CollapseComponent.java
           
           
           
            ant patch,把下面的內(nèi)容保存為 patch-build.xml 放到 D:\apache-solr-1.3.0 目錄下:

            Xml代碼

          <?xml  version="1.0" encoding="UTF-8"?>  
          <project name="solr-patch"  default="apply-patch" basedir=".">   
            
            <target  name="apply-patch" description="Apply a patch file. Set  -Dpatch.file">  
              <patch patchfile="${patch.file}"  strip="0"/>  
            </target>  
          </project> 

             ant 打補(bǔ)丁:

            Html代碼 D:\apache-solr-1.3.0>ant -Dpatch.file=SOLR-236_collapsing.patch -f  patch-build.xml 
          Buildfile: patch-build.xml 
           
          apply-patch: 
          [patch]  patching file src/test/org/apache/solr/search/TestDocSet.java 
          [patch]  patching file src/java/org/apache/solr/search/CollapseFilter.java 
          [patch]  patching file src/java/org/apache/solr/search/DocSet.java 
          [patch]  patching file src/java/org/apache/solr/search/NegatedDocSet.java 
          [patch]  patching file src/java/org/apache/solr/search/SolrIndexSearcher.java 
          [patch]  patching file src/java/org/apache/solr/common/params /CollapseParams.java 
          [patch] patching file  src/java/org/apache/solr/handler/component/CollapseComponent.java 
           
          BUILD  SUCCESSFUL 
          Total time: 0 seconds 
           
           
           
            源碼打上了補(bǔ)丁,然后用 ant 構(gòu)建源碼:

             D:\apache-solr-1.3.0>ant dist

            在 D:/apache-solr-1.3.0/dist 目錄下可以找到編譯好的 solr 了。然后把 solr 放到 tomcat 中去運(yùn)行它,把下面的內(nèi)容保存在 TOMCAT_HOME/conf/Catalina/localhost/solr.xml 文件中:

            Xml代碼

          <Context  docBase="D:\apache-solr-1.3.0\dist\apache-solr-1.3.0.war"  reloadable="true" >  
            <Environment name="solr/home"  type="java.lang.String" value="D:\apache-solr-1.3.0\example\solr"  override="true" />  
          </Context> 

            修改 D:\apache-solr-1.3.0\example\solr\conf\solrconfig.xml 使 solr 可以支持 collapse。

            定義搜索組件,在 QueryComponent 附近:

             <searchComponent name="collapse" class="org.apache.solr.handler.component.CollapseComponent" /> 

             定義一個(gè) handler 使用上面的搜索組件:

            Xml代碼

          <requestHandler  name="collapse" class="solr.SearchHandler">  
           <!-- default  values for query parameters -->  
            <lst name="defaults">  
              <str name="echoParams">explicit</str>  
            </lst>   
           <arr name="components">  
             <str>collapse</str>  
            <str>debug</str>  
            </arr>  
          </requestHandler> 
           
           
           
            安裝啟動(dòng) tomcat,現(xiàn)在提交一些數(shù)據(jù)給它,用官方的示例數(shù)據(jù)就可以了。運(yùn)行:

            Html代碼 D:\apache-solr-1.3.0\example\exampledocs>java -Durl=http://localhost:8080/solr/update   -Dcommit=yes -jar post.jar *.xml 
          SimplePostTool: version 1.2 
          SimplePostTool:  WARNING: Make sure your XML documents are encoded in UTF-8, other  encodings are not currently supported 
          SimplePostTool: POSTing  files to http://localhost:8080/solr/update .. 
          SimplePostTool:  POSTing file hd.xml 
          SimplePostTool: POSTing file ipod_other.xml 
          SimplePostTool:  POSTing file ipod_video.xml 
          SimplePostTool: POSTing file mem.xml 
          SimplePostTool:  POSTing file monitor.xml 
          SimplePostTool: POSTing file monitor2.xml 
          SimplePostTool:  POSTing file mp500.xml 
          SimplePostTool: POSTing file sd500.xml 
          SimplePostTool:  POSTing file solr.xml 
          SimplePostTool: POSTing file spellchecker.xml  
          SimplePostTool: POSTing file utf8-example.xml 
          SimplePostTool:  POSTing file vidcard.xml 
          SimplePostTool: COMMITting Solr index  changes..

            http://localhost:8080/solr/admin/stats.jsp 有結(jié)果了? 有了。然后開始查詢?cè)囋嚳础?/span>

            查詢:http://localhost:8080/solr/select/?q=*%3A*&indent=on& qt=collapse&collapse=true&collapse.field=popularity&collapse.threshold=1
           
           
           
           
            結(jié)果:

            Xml代碼  

          <?xml  version="1.0" encoding="UTF-8"?>  
          <response>  
            
          <lst  name="responseHeader">  
           <int name="status">0</int>   
           <int name="QTime">0</int>  
           <lst  name="params">  
           <str  name="collapse.field">popularity</str>  
           <str  name="fl">id</str>  
           <str  name="collapse.threshold">1</str>  
           <str  name="indent">on</str>  
           <str name="q">*:*</str& gt;  
           <str name="qt">collapse</str>  
           <str  name="collapse">true</str>  
           </lst>  
          </lst>   
          <lst name="collapse_counts">  
           <str  name="field">popularity</str>  
           <lst name="doc">  
            <int name="SP2514N">4</int>  
           <int  name="F8V7067-APL-KIT">1</int>  
           <int  name="MA147LL/A">1</int>  
           <int  name="TWINX2048-3200PRO">1</int>  
           <int  name="VS1GB400C3">3</int>  
           <int  name="1">10</int>  
           </lst>  
           <lst  name="count">  
           <int name="6">4</int>  
           <int  name="1">1</int>  
           <int name="10">1</int>  
            <int name="5">1</int>  
           <int name="7">3</int& gt;  
           <int name="0">10</int>  
           </lst>  
            <str name="debug">HashDocSet(6) Time(ms): 0/0/0/0</str>  
          </lst>   
          <result name="response" numFound="6" start="0">  
            <doc>  
           <str name="id">SP2514N</str>  
            </doc>  
           <doc>  
           <str  name="id">F8V7067-APL-KIT</str>  
           </doc>  
            <doc>  
           <str name="id">MA147LL/A</str>  
            </doc>  
           <doc>  
           <str  name="id">TWINX2048-3200PRO</str>  
           </doc>  
            <doc>  
           <str name="id">VS1GB400C3</str>  
            </doc>  
           <doc>  
           <str name="id">1</str>   
           </doc>  
          </result>  
          </response>  
          可以看到  collapse_counts 相關(guān)的輸出: 
           
          <lst name="collapse_counts">  
            <str name="field">popularity</str>  
           <lst  name="doc">  
           <int name="SP2514N">4</int>  
          ...  
            </lst>  
           <lst name="count">  
           <int  name="6">4</int>  
           <int name="1">1</int>  
            <int name="10">1</int>  
           <int  name="5">1</int>  
           <int name="7">3</int>  
            <int name="0">10</int>  
           </lst>  
           <str  name="debug">HashDocSet(6) Time(ms): 0/0/0/0</str>  
          </lst>  

            上面的 count 下的內(nèi)容(它的順序是result/doc的順序),表示 popularity=6 相同的結(jié)果還有 4 個(gè),與 popularity=1 相同的結(jié)果還有 1 個(gè),依此類推。這樣就可以顯示給用戶的界面里提示“相同的其它內(nèi)容不有N個(gè)”。

             使用的參數(shù)有:

            #啟用 collapse 組件 

            collapse=true 

            #用那個(gè) 字段來 hash 去除重量?jī)?nèi)容 

            collapse.field=popularity 

            #要結(jié)果中可以最多出 現(xiàn)幾個(gè)相同的文檔 

            collapse.threshold=1 

            當(dāng)然還有其它參數(shù),請(qǐng) 看:org.apache.solr.common.params.CollapseParams 類。
           
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之九(solr的查詢語法)

            solr的一些查詢語法

            1. 首先假設(shè)我的數(shù)據(jù)里fields有:name, tel, address 預(yù)設(shè)的搜尋是name這個(gè)字段, 如果要搜尋的數(shù)據(jù)剛好就是 name 這個(gè)字段,就不需要指定搜尋字段名稱.

             2. 查詢規(guī)則:

            如欲查詢特定字段(非預(yù)設(shè)字段),請(qǐng)?jiān)诓樵冊(cè)~前加上該字段名稱加 “:” (不包含”號(hào)) 符號(hào),

             例如: address:北京市海淀區(qū)上地軟件園 tel:88xxxxx1

            1>. q代表query input

             2>. version代表solr版本(建議不要變動(dòng)此變量)

            3>. start代表顯示結(jié)果從哪一筆結(jié)果資料開始,預(yù)設(shè)為0代表第一筆, rows是說要顯示幾筆數(shù)據(jù),預(yù)設(shè)為10筆

            (因?yàn)橛袝r(shí)查詢結(jié)果 可能有幾百筆,但不需要顯示所有結(jié)果,所以預(yù)設(shè)是從第一筆開始到第十筆)

            所以若要顯示第10到30筆就改為:

             http: //localhost:8080/solr/select/?indent=on&version=2.2&q=address:北京 市海淀區(qū)上地軟件園+tel:88xxxxx1&version=2.2&start=10&rows= 20&indent=on

            (indent代表輸出的xml要不要縮行.預(yù)設(shè)為開啟 on)

            3. 另外,要限定輸出結(jié)果的內(nèi)容可用 “fl=” 加上你要的字段名稱,如以下這個(gè)范例:

            http: //localhost:8080/solr/select/?indent=on&version=2.2&q=text:北京+ OR+text:億度&start=0&rows=10&fl=name,address,tel

            在fl= 之后加上了name,adress,tel

            所以結(jié)果會(huì)如下:

          <result name=”response” numFound=”1340″ start=”0″>
          <doc>
          <str name=”name”>北京億度</str>
          <str name=”address”>北京市海淀區(qū)上地軟件園</str>
          <str name=”tel”>88xxxxxx1</str>
          </doc>
          <doc>
          <str name=”name”>北京億度</str>
          <str name=”address”/>
          <str name=”tel”>88xxxxxx1</str>
          </doc>
          </result>

             5. 查詢 name 或 address:直接輸入查詢?cè)~, 如: 億度

            送出的內(nèi)容即為:

            name:億度 AND address:海淀

            6. 若要搜尋聯(lián)集結(jié)果,請(qǐng)?jiān)谠~與詞間空格或加上大寫 “OR” (不包含”號(hào)).

             例如: text:海淀 OR text:億度

            text:海淀 OR 億度 

            或

            海淀 億度

            或

            name:億度 OR tel:88xxxxxx1

            或

             name:億度 tel:88xxxxxx1

            5. 若要搜尋交集結(jié)果,請(qǐng)?jiān)谠~與詞間加上大寫 “AND” 或 “+” (不包含”號(hào)).

            例如: text:海淀 AND 億度 

            或

            +text:海淀 +text:億度

            或

            name:億度 AND tel:88xxxxxx1

            或

             name: ( +億度 +海淀)

            6. 排除查詢

            在要排除的詞前加上 “-” (不包含”號(hào)) 號(hào)

             例如: 海淀 -億度

            搜尋結(jié)果不會(huì)有包含億度的詞的結(jié)果在內(nèi)

            7. Group 搜尋

            使用 “()” 來包含一個(gè)group

            如希望搜尋在店名字段內(nèi)同時(shí)有 “臺(tái)北”(不包含”號(hào)) 及 “火車站”(不包含”號(hào))

             8. 增加權(quán)重: 如要搜尋 “北京 加油站”(不包含”號(hào)) 但因?yàn)榛貍魈喙P資料內(nèi)有 “中華”(不包含”號(hào)) 或 “加油站”(不包含”號(hào)) 的結(jié)果,

            所以想要把有包含 “加油站”(不包含”號(hào))的數(shù)據(jù)往前排,可使用 “^”(不包含”號(hào))符號(hào)在后面加上愈增加的權(quán)重?cái)?shù),

             像是 “2″,則可以這樣做:

            北京 加油站^2

            會(huì)同時(shí)搜尋含有北京或加油站的結(jié)果,并把加油站這個(gè)詞加權(quán)所以 搜尋時(shí)會(huì)先判斷加油站這一個(gè)詞在

            搜尋結(jié)果中的比重,甚至假設(shè)一筆數(shù)據(jù)內(nèi)加油站出現(xiàn)過兩次以上的就更加會(huì)有優(yōu)先權(quán).

             查詢時(shí)在查詢?cè)~后加上 “^” (不包含”號(hào)) 再加上權(quán)重分?jǐn)?shù)

            例如: 億度 AND “北京”^2

            或

             億度^2 OR 北京

            9. Wildcard 搜尋使用 “*” 符號(hào); 如果輸入 “中國*銀” (不包含”號(hào)), 結(jié)果會(huì)有中國信托商業(yè)銀行, 中國輸出入銀行圖書閱覽室, 中國商銀證券

            中國及銀之間可夾任何長(zhǎng)短字詞.
           
           
           
          利用SOLR搭建企業(yè)搜索平臺(tái) 之十(數(shù)據(jù)庫數(shù)據(jù)導(dǎo)入到solr)

            solr不可謂是個(gè)好東西啊,越往下挖掘,他的各種功能逐漸的展現(xiàn)在我的面前,對(duì)于solr的架構(gòu) 人員,不得不令人佩服啊。

            幾天前偶爾看到IBM developmentWorks上面的一片文章,看到了數(shù)據(jù)庫數(shù)據(jù)的導(dǎo)入,以前我一直是這么認(rèn)為的,像這種導(dǎo)入可以自己去寫程序去導(dǎo)入。

             寫程序 可以將數(shù)據(jù)讀出100條,如果你的內(nèi)存夠大,可以是1000條甚至更多,然后放入Collection中,批量提交至solr。或者讀取數(shù)據(jù)寫入xml文 件中,再將該文件提交到solr等等。但是,在我看到那一篇文章的時(shí)候,原來還有這么巧妙的招。

            廢話不多說,入正題。

             一.首先準(zhǔn)備好solr的dataimport功能需要的東西,在solr的下載包中。分別在:

            1》Solr- 1.3.0\dist\apache-solr-dataimporthandler-1.3.0.jar

            2》 E:\education\search\Solr-1.3.0\example\example-DIH\solr\

            3》你是哪種 數(shù)據(jù)庫,提供該數(shù)據(jù)庫的jdbc驅(qū)動(dòng)。

            二.如果你還不會(huì)運(yùn)行solr,請(qǐng)參考本人的前幾篇博客。這里要做的是,先把 E:\education\search\Solr-1.3.0 \example\example-DIH\solr\下面的東西拷貝到solr的HOME目錄,然后刪除rss,這個(gè)是另外一個(gè)功能是導(dǎo)入rss訂閱信 息到solr中,確實(shí)很強(qiáng),這都想到了。將jar文件,實(shí)際就兩個(gè)拷貝到tomcat的webapps下面的solr的WEB-INF的lib文件夾下 面。

            三.更改solr Home目錄下的conf/solrconfig.xml,其實(shí)就是提交一個(gè)solrRequestHandler,代碼如下:

             Xml代碼

          <requestHandler name="/dataimport"  class="org.apache.solr.handler.dataimport.DataImportHandler"> 
             <lst name="defaults"> 
             <str  name="config">C:\solr-tomcat\solr\db\conf\db-data-config.xml</str>  
            </lst> 
           </requestHandler>
           
           
           
            四.將solr Home目錄下面的solrconfig.xml和schema.xml拷貝到db文件夾下面的conf中。

            五.修改db\conf \db-data-config.xml

            Xml代碼

          <dataConfig> 
            <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"  url="jdbc:mysql://localhost:3306/tuitui" user="root"  password="mysql"/> 
            <document name="shop"> 
                 <entity name="tuitui_shop" pk="shopId" query="select * from  tuitui_shop"> 
                <field column="shopid" name="shopId" />  
                <field column="shopName" name="shopName" /> 
                 <field column="shopUrl" name="shopUrl" /> 
                <field  column="keyword" name="keyword" /> 
                <field  column="synopsis" name="synopsis" /> 
                <field  column="province" name="province" /> 
                <field  column="city" name="city" /> 
                <field column="domain"  name="domain" /> 
                <field column="address" name="address"  /> 
                <field column="coordinate" name="coordinate" /> 
                 <field column="shopSspn" name="shopSspn" /> 
                 <field column="phone" name="phone" /> 
                <field  column="createTime" name="createTime" /> 
              </entity> 
             </document> 
          </dataConfig>
           
           
           
            其中的意思我做簡(jiǎn)單解釋,具體大家可以去看看官方 wiki。
            document:一個(gè)文檔也就是lucene的document這個(gè)沒什么解釋的;
            entity:主要針對(duì)的是 一個(gè)數(shù)據(jù)庫表;
            filed:屬性column是數(shù)據(jù)庫的字段,name是filed的名字,即schema中的field name
             http://wiki.apache.org/solr/DataImportHandler
             我的數(shù)據(jù)庫表結(jié)構(gòu)發(fā)出來:



            六.啟動(dòng)TOMCAT,輸入地址進(jìn)行導(dǎo)入,導(dǎo)入 分為很多模式:我選用的全部倒入模式。
            http://localhost/solr/dataimport?command=full-import
            結(jié)果:
             00C:\solr-tomcat\solr\db\conf\db-data-config.xmlfull-importidle1202009-09-0521:28:08Indexing completed. Added/Updated: 2 documents. Deleted 0documents.2009-09-05 21:28:092009-09-05 21:28:090:0:0.579This responseformat is experimental. It is likely to change in the future.
            七.在去查詢你剛才提交的數(shù)據(jù),搞定。
            最后 在說說這個(gè)功能。上面的例子只不過是很簡(jiǎn)單的一個(gè)部分。針對(duì)solr的MultiCore,通過配置db-data-config.xml也可以實(shí)現(xiàn),還 有多表,或者多表關(guān)聯(lián)等等操作只要在db-data-config.xml配置清楚都可以進(jìn)行數(shù)據(jù)的導(dǎo)入。
            在solr1.4中還有更多的擴(kuò) 展功能,這些功能為重建索引提供能很方便的操作。而且,datasource不單單指的是database,可以是xml文件,還可以是來自網(wǎng)絡(luò)上的等 等。
           
           

          利用SOLR搭建企業(yè)搜索平臺(tái) 之十一(中文分詞之IK)

             在經(jīng)過使用了庖丁以后,這里說說怎么將目前很火很流行的IK集成進(jìn)SOLR,其實(shí)方法真的很簡(jiǎn)單,比 paoding方便不少。這里很感謝IK的作者,藍(lán)山咖啡,很感謝你為中文分詞做出的貢獻(xiàn)。 作者博客:http://linliangyi2007.javaeye.com
             入正題:
            1》請(qǐng)先去作者博客參看IK下載地址,主要就是一個(gè)IKAnalyzer3.1.1Stable.jar。我這里用的是最新版!
            Java代碼 package com.yeedoo.slor.tokenizer; 
           
          import  java.io.Reader; 
           
          import org.apache.lucene.analysis.TokenStream; 
          import  org.apache.solr.analysis.BaseTokenizerFactory; 
          import  org.wltea.analyzer.lucene.IKAnalyzer; 
           
          public class  ChineseTokenizerFactory extends BaseTokenizerFactory { 
           
            @Override 
           public TokenStream create(Reader reader) { 
           return  new IKAnalyzer().tokenStream("text", reader); 
           } 
           
          }
            從代碼 就可以看得出來真的很方便!將它打包放入solr.war中同時(shí)還有IK的jar包。如果你不想打包,請(qǐng)去附件下載已經(jīng)打好的包。
            2》配置 文件
            Xml代碼 <fieldType name="text" class="solr.TextField" positi> 
             <analyzer type="index"> 
            <tokenizer  class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory" /> 
             <filter class="solr.StopFilterFactory" ignoreCase="true"  words="stopwords.txt" enablePositi /> 
            <filter  class="solr.WordDelimiterFilterFactory" generateWordParts="1"  generateNumberParts="1" catenateWords="1" catenateNumbers="1"  catenateAll="0" split /> 
            <filter  class="solr.LowerCaseFilterFactory" /> 
            <filter  class="solr.EnglishPorterFilterFactory" protected="protwords.txt" /> 
             <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
             </analyzer> 
            <analyzer type="query"> 
             <tokenizer class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory"  /> 
            <filter class="solr.SynonymFilterFactory" syn  ignoreCase="true" expand="true" /> 
            <filter  class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"  /> 
            <filter class="solr.WordDelimiterFilterFactory"  generateWordParts="1" generateNumberParts="1" catenateWords="0"  catenateNumbers="0" catenateAll="0" split /> 
            <filter  class="solr.LowerCaseFilterFactory" /> 
            <filter  class="solr.EnglishPorterFilterFactory" protected="protwords.txt" /> 
             <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
             </analyzer> 
           </fieldType>

          posted on 2011-06-14 22:31 SIMONE 閱讀(3764) 評(píng)論(1)  編輯  收藏 所屬分類: JAVA

          FeedBack:
          # re: 利用SOLR搭建企業(yè)搜索平臺(tái)
          2014-05-08 10:24 | milk
          不錯(cuò),頂你................  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 正定县| 闽侯县| 泸西县| 江西省| 新闻| 天镇县| 田阳县| 金沙县| 遂平县| 沿河| 杂多县| 阿尔山市| 盐池县| 哈尔滨市| 谢通门县| 涿州市| 庄河市| 金寨县| 齐河县| 翁源县| 砚山县| 罗甸县| 子长县| 天长市| 仪征市| 镇安县| 延津县| 英山县| 鹤山市| 吉林省| 永胜县| 临西县| 晋江市| 佳木斯市| 巴南区| 宣威市| 永吉县| 芜湖县| 桑植县| 大邑县| 佛冈县|