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


1、字段

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

    name:字段名

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

    indexed:是否需要索引

    stored:是否需要存儲

    required:是否唯一

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

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

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

    建立索引之后,如下

 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:計算機

2、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。

  

 

3、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);

圖:未使用權重的結果

            圖:使用了權重之后的結果

  

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

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

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

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

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

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

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

格式: rord(myIndexedField).

5、sum,這個函數的意思就顯而易見啦,它就是表示“和”。

格式:sum(x,1)

        sum(x,y)

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

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

格式:product(x,2)

        product(x,y)

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

格式:div(1,x)

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

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

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

            pow(x,log(y))

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

格式:abs(-5)

        abs(x)

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

格式: log(x)

         log(sum(x,100))

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

格式:sqrt(2)

          sqrt(sum(x,100))

12、map,如果 min<=x<=max,那么map(x,min,max,target)=target,如果 x不在[min,max]這個區間內,那么map(x,min,max,target)=x.

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

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

14、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) 在前一個例子的基礎上又加了一個默認值。

15、linear,linear(x,m,c)表示 m*x+c ,其中m和c都是常量,x是一個變量也可以是一個函數。

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

16、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)

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

例如:max(myfield,0)

  4、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>  

  5、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值) 

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

      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

 


免責聲明!

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



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