Solr 多字段、打分規則、權重和實時索引同步

一、字段

  Filed:<field name="_id" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />前端

    name:字段名mysql

    type:字段類型,影響分詞結果web

    indexed:是否須要索引sql

    stored:是否須要存儲數據庫

    required:是否惟一apache

    multiValued:是否多值,對於copyField字段有效json

  dynamicField:動態字段 <dynamicField name="bd01010*" type="text_ik"    indexed="true"  stored="true"  multiValued="true"/>app

    如:{"_id":"change.me","bd01003":"美好的生活,將來","bd01010.0.text":"你好,計算機能力","bd01010.1.text":"生活","bd01007":"清華大學出版社"}webapp

    創建索引以後,以下ide

 1 {
 2   "responseHeader": {
 3     "status": 0,
 4     "QTime": 3,
 5     "params": {
 6       "lowercaseOperators": "true",
 7       "bq": "bd01test^2",
 8       "fl": "score,_id,bd01003,bd01010*,bd01007,bd01keyword",
 9       "indent": "true",
10       "qf": "bd01keyword",
11       "_": "1469434764614",
12       "q.alt": "bd01keyword:計算機",
13       "stopwords": "true",
14       "wt": "json",
15       "defType": "edismax"
16     }
17   },
18   "response": {
19     "numFound": 2,
20     "start": 0,
21     "maxScore": 0.09362577,
22     "docs": [
23       {
24         "_id": "change.me2",
25         "bd01003": "計算機",
26         "bd01010.0.text": [
27           "你好,能力"
28         ],
29         "bd01010.1.text": [
30           "生活"
31         ],
32         "bd01007": "清華大學出版社",
33         "score": 0.09362577
34       },
35       {
36         "_id": "change.me",
37         "bd01003": "美好的生活,將來",
38         "bd01010.0.text": [
39           "你好,計算機能力"
40         ],
41         "bd01010.1.text": [
42           "生活"
43         ],
44         "bd01007": "清華大學出版社",
45         "score": 0.06553804
46       }
47     ]
48   }
49 }
View Code

  copyField:字段組合 ,以下

1    <copyField source="bd01010*" dest="bd01test"/>  
2    <copyField source="bd01test" dest="bd01keyword"/>
3    <copyField source="bd01003"  dest="bd01keyword"/>     
4    <copyField source="bd01007"  dest="bd01keyword"/

  若是想對上面的dynamicField字段進行查詢,====》bd01test:計算機

  若是想對上面的dynamicField字段+其它字段進行查詢,====》bd01keyword:計算機

二、edismax

  q.alt: 當q字段爲空時,用於設置缺省的query,一般設置q.alt爲*:*。 如q.alt = title:計算機

  qf:query fields,指定solr從哪些field中搜索。 如qf=title

  mm: Minimum ‘Should’ Match。 Solr支持三種查詢clause,即「必須出現」, 「不能出現」和「能夠出現」,分別對應於AND, -, OR

  pf: boosting phrases over words。用於指定一組field,當query徹底匹配pf指定的某一個field時,來進行boost,給搜索匹配到的字段打分  如pf =字段1^0.5 字段2^0.2  

  ps: Phrase Slop. 短語坡度。短語查詢的坡度量用在pf字段,影響boost。

  qs:Query Phrase Slop。查詢短語坡度。查詢短語坡度是指短語查詢明確包含用戶查詢的字符串(在qf字段,影響匹配)。

  tie:tie breaker。float值做爲決勝局中DisjunctionMaxQueries使用(應該是遠小於1)。

  bq: Boost Query。對某個field的value進行boost,例如brand:xq^5.0。

  bf :Boost Functions。用函數的方式計算boost

  uf:User Fields。用戶字段。制定模式的字段能夠被用戶顯示的查詢。此參數支持通配符。

  pf2:Phrase bigram fields。短語兩字母字段。e.g. 「the brown fox jumped」 is queried as 「the brown」 「brown fox」 「fox jumped」。

  pf3:Phrase trigram fields。短語三字母字段。e.g. 「the brown fox jumped」 is queried as 「the brown fox」 「brown fox jumped」。

  ps2:短語兩字母坡度。若是未指定,將使用」ps」。

  ps3:短語三字母坡度。若是未指定,將使用」ps」。

  boostBoost Function, multiplicative。做爲bf,score=bf*score。bf =sum(div(字段,100),1),

  stopwords:單詞停用,true 或false。

  lowercaseOperators:此參數用於控制小寫單詞做爲布爾運算符,如」and」 and 「or」。設置與lowercaseOperators= true來容許此。默認爲true。

  

 

三、solr 函數

 

  bf、boost 裏均可以寫權重的函數

  div(字段,100):表示 字段的值/100 獲得一個新值

  pow(字段,2):表示 字段的值的2次方   獲得一個新值

  linear(x,2,4) 表示  2*x+4

     sqrt(x) 表示 X的平方根

 

   boost = sum(div(字段,100),1), 設 a=字段值  ,則 權重 =權重*(a/100+1);

圖:未使用權重的結果

            圖:使用了權重以後的結果

  

一、constant:支持有小數點的常量,

例如,1.5,查詢表達式就是:_val_:1.5

二、fieldvalue,這個函數將會返回numeric field的值,這個域必須是indexd的,非multiValued的。格式很簡單,就是該域的名字。若是這個域中沒有這樣的值,那麼將會返回0。

三、ord,對於一個域,它全部的值都將會按照字典順序排列,這個函數返回你要查詢的那個特定的值在這個順序中的排名。這個域,必須是非multiValued的,當沒有值存在的時候,將返回0。

例如:某個特定的域只能去三個值,「apple」、「banana」、「pear」,那麼ord(「apple」)=1,ord(「banana」)=2,ord(「pear」)=3.

須要注意的是,ord()這個函數,依賴於值在索引中的位置,因此當有文檔被刪除、或者添加的時候,ord()的值就會發生變化。當你使用MultiSearcher的時候,這個值也就是不定的了。

四、rord,這個函數將會返回與ord相對應的倒排序的排名。

格式: rord(myIndexedField).

五、sum,這個函數的意思就顯而易見啦,它就是表示「和」。

格式:sum(x,1)

        sum(x,y)

        sum(sqrt(x),log(y),z,0.5)

六、product,product(x,y,...)將會返回多個函數的乘積。

格式:product(x,2)

        product(x,y)

七、div,div(x,y)表示x除以y的值

格式:div(1,x)

        div(sum(x,100),max(y,1))

八、pow,pow表示冪值。pow(x,y) =x^y。

格式:pow(x,0.5) 表示開方

            pow(x,log(y))

九、abs,abs(x)將返回表達式的絕對值

格式:abs(-5)

        abs(x)

十、log,log(x)將會返回基數爲10,x的對數

格式: log(x)

         log(sum(x,100))

十一、sqrt,sqrt(x) 返回 一個數的平方根

格式:sqrt(2)

          sqrt(sum(x,100))

十二、map,若是 min<=x<=max,那麼map(x,min,max,target)=target,若是 x不在[min,max]這個區間內,那麼map(x,min,max,target)=x.

格式:map(x,0,0,1)

1三、scale,scale(x,minTarget,maxTarget) 這個函數將會把x的值限制在[minTarget,maxTarget]範圍內。

1四、query,query(subquery,default)將會返回給定subquery的分數,若是subquery與文檔不匹配,那麼將會返回默認值。任何的查詢類型都是受支持的。能夠經過引用的方式,也能夠直接指定查詢串。

 例子:q=product(popularity, query({!dismax v='solr rocks'})) 將會返回popularity和經過dismax 查詢獲得的分數的乘積。

         q=product(popularity, query($qq)&qq={!dismax}solr rocks) 跟上一個例子的效果是同樣的。不過這裏使用的是引用的方式

         q=product(popularity, query($qq,0.1)&qq={!dismax}solr rocks) 在前一個例子的基礎上又加了一個默認值。

1五、linear,linear(x,m,c)表示 m*x+c ,其中m和c都是常量,x是一個變量也能夠是一個函數。

例如:linear(x,2,4)=2*x+4.

1六、recip,recip(x,m,a,b)=a/(m*x+b),其中,m、a、b是常量,x是變量或者一個函數。當a=b,而且x>=0的時候,這個函數的最大值是1,值的大小隨着x的增大而減少。

例如:recip(rord(creationDate),1,1000,1000)

1七、max,max(x,c)將會返回一個函數和一個常量之間的最大值。

例如:max(myfield,0)

  四、autoCommint 和autoSoftCommint

   在不少狀況下,咱們並不想本身主動觸發COMMIT相應的XML給SOLR,這樣帶來不少的不便(例如頻繁commit,會帶來性能上較大的消耗),恰 好,SOLR經過配置文件能夠自行在知足指定的條件下自動的COMMIT索引,同時,讓前端檢索實例能夠檢索到最新生成的數據,而不須要人爲干預。

1     <requestHandler name="/update" class="solr.XmlUpdateRequestHandler">  
2         <maxPendingDeletes>10000</maxPendingDeletes>  
3         <autoCommit>  
4             <maxDocs>20</maxDocs>  
5             <maxTime>${solr.autoCommit.maxTime:15000}</maxTime>  
6        <openSearcher>true</openSearcher> 7 </autoCommit> 8 </requestHandler>

  上 面autoCommit中的maxDocs指定的pending多少個文檔後執行一次commit,而maxTime指定了多長時間間隔進行一次 commit,通常這兩個選項只須要配置一個便可知足須要。另外,每次commit會將最近的更新生效,可是若是一次commit操做還沒有完成,又達到了 下一次commit的時刻,這樣作會嚴重影響索引的吞吐量。

 

  自動硬提交方式:maxTime:設置多長時間提交一次maxDocs:設置達到多少文檔提交一次openSearcher:文檔提交後是否開啓新的searcher,
若是false,文檔只是提交到index索引庫,搜索結果中搜不到這次提交的文檔;若是true,既提交到index索引庫,也能在搜索結果中搜到這次提交的內容。

 

在Solr 4.0將會實現一種基於「軟自動提交」(soft auto commit)的功能,它會根據當前的系統上下文決定是否提交(簡單的狀況就是,確保每次commit完成,也就是最近的索引數據更新已經更新同步到磁盤上以後再自動執行下一次commit)

 

1     <autoSoftCommit>  
2           <maxTime>${solr.autoSoftCommit.maxTime:1800000}</maxTime>  
3           <maxDocs>100</maxDocs>  
4     </autoSoftCommit>  

  五、Solr與mysql 增量索引同步

  1.在進行增量索引前,首先要弄懂幾個必要的屬性,以及數據庫建表事項,和 deltaimport.properties,dataimport.properties, data-config.xml裏面的數據
     transformer 格式轉化:HTMLStripTransformer 索引中忽略HTML標籤
     query:查詢數據庫表符合記錄數據 
         deltaQuery:增量索引查詢主鍵ID     注意這個只能返回ID字段 
     deltaImportQuery:增量索引查詢導入數據 
     deletedPkQuery:增量索引刪除主鍵ID查詢  ---> 注意這個只能返回ID字段 
         數據庫配置注意事項 
    1.若是隻涉及添加,與修改業務,那麼數據庫裏只需額外有一個timpstamp字段 
      就能夠了,默認值爲當前系統時間,CURRENT_TIMESTAMP(筆者的數據爲mysql的) 
    2.若是還涉及刪除業務,那麼數據裏就需額外再多添加一個字段isdelete,int類型的 
      用0,1來標識,此條記錄是否被刪除,固然也能夠用其餘字段標識,ture或false均可以 


   deltaimport.properties,dataimport.properties
     這個配置文件很重要,它是用來記錄當前時間與上一次修改時間的,經過它可以找出,那些,新添加的,修改的,或刪除的記錄
                           
 

  

  clean:選擇是否要在索引開始構建以前刪除以前的索引,默認爲true

  commit:選擇是否在索引完成以後提交。默認爲true

  optimize:是否在索引完成以後對索引進行優化。默認爲true

  debug:是否以調試模式運行,適用於交互式開發(interactive development mode)之中。

 新增collections1/conf/data-config.xml文件 

 1 <dataConfig>
 2     <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.121:3306/test" user="root" password="ttestO" batchSize="-1" />
 3     <document name="content">
 4         <entity pk="bd01001" name="bd01"  
 5                 query="select bd01001,bd01002,bd01003,bd01004,bd01005,bd01006 from `bd01`"
 6                 deltaQuery="select bd01001  from bd01 where bd01996 > '${dataimporter.last_index_time}'" 
 7                 deletedPkQuery="select bd01001   from bd01 where bd01997=1"
 8                 deltaImportQuery="select bd01001,bd01002,bd01003,bd01004,bd01005,bd01006 from bd01 where bd01001='${dataimporter.delta.bd01001}'"> 
 9             <field column="bd01001" name="_id"/>
10             <field column="bd01002" name="bd01002" />    
11             <field column="bd01003" name="bd01003" />    
12             <field column="bd01004" name="bd01004" />    
13             <field column="bd01005" name="bd01005"/>
14             <field column="bd01006" name="bd01006" />    
15          </entity>
16     </document>

17 </dataConfig>

  下面分別來介紹屬性:

   entity.pk="bd01001"  數據表的主鍵ID

   全量導入

     query="select * from bd01 where isdelete=0  查詢是指 查詢出表裏全部未刪除的數據進行全量導入建索引

   增量索引

     添加、修改 索引 

     deltaQuery="select bd01001 from bd01 where isDelete = 0 and  my_date > '${dataimporter.last_index_time}'"

     deltaQuery的意思是,查詢出全部通過修改的記錄的ID 多是修改操做,添加操做,刪除操做產生的 (此查詢只對增量導入起做用,並且只能返回ID值)

     deltaImportQuery="select * from bd01 where ID='${dataimporter.delta.bd01001}'" 次查詢是獲取以上兩步的ID,而後把其所有數據獲取,根據獲取的數據 對索引庫進行更新操做,多是添加,修改 (此查詢只對增量導入起做用)

     刪除索引

         deletedPkQuery="select ID from bd01 where isdelete=1" 此操做值查詢那些數據庫裏僞刪除的數據的ID(即isdelete標識爲1的數據) solr經過它來刪除索引裏面對應的數據 (此查詢只對增量導入起做用,並且只能返回ID值) 

  六、增量索引定時同步更新

      1. 將 apache-solr-dataimportscheduler-1.0.jar 和solr自帶的 apache-solr-dataimporthandler-.jar, apache-solr-dataimporthandler-extras-.jar 放到solr.war的lib目錄下面 

 


        2.修改solr.war中WEB-INF/web.xml, 在servlet節點前面增長:

1 <listener>
2           <listener-class>
3          org.apache.solr.handler.dataimport.scheduler.ApplicationListener
4           </listener-class>
5 </listener>

     3.將apache-solr-dataimportscheduler-.jar 中 dataimport.properties 取出並根據實際狀況修改,而後放到 solr.home/conf (不是solr.home/core/conf) 目錄下面

  

 1 #################################################
 2 #                                               #
 3 #       dataimport scheduler properties         #
 4 #                                               #
 5 #################################################
 6 
 7 #  to sync or not to sync
 8 #  1 - active; anything else - inactive
 9 syncEnabled=1
10 
11 #  which cores to schedule
12 #  in a multi-core environment you can decide which cores you want syncronized
13 #  leave empty or comment it out if using single-core deployment
14 syncCores=collection1
15 
16 #  solr server name or IP address
17 #  [defaults to localhost if empty]
18 server=localhost
19 
20 #  solr server port
21 #  [defaults to 80 if empty]
22 port=8080
23 
24 #  application name/context
25 #  [defaults to current ServletContextListener's context (app) name]
26 webapp=solr
27 
28 #  URL params [mandatory]
29 #  remainder of URL
30 #增量
31 params=/dataimport?command=delta-import&clean=false&commit=true&wt=json&indent=true&optimize=false
32 
33 #  schedule interval
34 #  number of minutes between two runs
35 #  [defaults to 30 if empty]
36 interval=1
37 
38 #  重作索引的時間間隔,單位分鐘,默認7200,即1天; 
39 #  爲空,爲0,或者註釋掉:表示永不重作索引
40 reBuildIndexInterval=0
41 
42 #  重作索引的參數
43 #reBuildIndexParams=/dataimportUserFull?command=full-import&clean=true&commit=true&optimize=true&wt=json&indent=true&entity=zpxx&verbose=false&debug=false
44 reBuildIndexParams=/dataimport?command=full-import&indent=true&wt=json&_=1469693722233423
45 #  重作索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
46 #  兩種格式:2012-04-11 03:10:00 或者  03:10:00,後一種會自動補全日期部分爲服務啓動時的日期
47 reBuildIndexBeginTime=16:06:30
相關文章
相關標籤/搜索