java 用来查找输出的函数_Solr复杂查询一:函数查询
一.簡(jiǎn)介
Solr的函數(shù)可以動(dòng)態(tài)計(jì)算每個(gè)文檔的值,而不是返回在索引階段對(duì)應(yīng)字段的靜態(tài)數(shù)值集。函數(shù)查詢是一類特殊的查詢,它可以像關(guān)鍵詞一樣添加到查詢中,對(duì)所有文檔進(jìn)行匹配并返回它們的函數(shù)計(jì)算值作為文檔得分。使用函數(shù)查詢,函數(shù)計(jì)算結(jié)果將用于修改相關(guān)度得分或用于搜索結(jié)果的排序。在應(yīng)用程序?qū)?#xff0c;函數(shù)計(jì)算的結(jié)果可以作為一個(gè)動(dòng)態(tài)字段添加到每個(gè)文檔。函數(shù)也可以嵌套,即一個(gè)函數(shù)的輸出可以作為另一個(gè)函數(shù)的輸入,函數(shù)允許嵌套任意多層。
二.函數(shù)語法
Solr的標(biāo)準(zhǔn)函數(shù)語法首先定義一個(gè)函數(shù)名,后面緊跟一對(duì)括號(hào),括號(hào)中包括零個(gè)、一個(gè)或多個(gè)輸入?yún)?shù),參數(shù)之間以逗號(hào)分隔:
functionName()
functionName(input1)
funtionName(input1,...inputN)
以下內(nèi)容都可以作為 函數(shù)的輸入:
1.常量。例如:100,“Hello world”等
2.字段。例如:fieldName,field(fieldName)
3.另一個(gè)函數(shù)。例如:functionName(...)
4.替代參數(shù)。例如:q={!func}min($f1,$f2)&f1=sqrt(popularity)&f2=1
Solr將文檔中每個(gè)輸入?yún)?shù)的類型定義為函數(shù),初看可能會(huì)對(duì)此感到困惑。絕大多數(shù)函數(shù)遵循標(biāo)準(zhǔn)的函數(shù)語法,但常量函數(shù)、字段函數(shù)和替代參數(shù)是簡(jiǎn)化語法的特例。常量函數(shù)的語法就是常量值本身;字段函數(shù)的語法是字段的名稱,可以選擇性地在函數(shù)中包含field命名;替代參數(shù)的語法是$parameter,其表示URL請(qǐng)求的查詢字符串參數(shù)。除此之外,其它函數(shù)都遵循標(biāo)準(zhǔn)的函數(shù)語法。
由于函數(shù)的所有 輸入可以看成函數(shù)本身【即使輸入的是常量函數(shù)】,標(biāo)準(zhǔn)的函數(shù)語法可以在概念上簡(jiǎn)化為functionName(function1,...,functionN)。
假設(shè)文檔中的fieldContainingNumber字段包含值-99,則會(huì)出現(xiàn)以下情況:
不難看出,每個(gè)函數(shù)可以容易地將字段函數(shù)置換為常量函數(shù)或者其他標(biāo)準(zhǔn)函數(shù)。雖然每個(gè)例子中計(jì)算輸入?yún)?shù)的命令和方法不同,但都返回了-99和2之間的最大值。將一個(gè)函數(shù)輸入作為另一個(gè)函數(shù)的參數(shù)的好處是,以有趣的方式組合函數(shù)來實(shí)現(xiàn)復(fù)雜的計(jì)算。
并不是所有的函數(shù)都接受相同類型的輸入?yún)?shù)。一些函數(shù)將常量值輸入轉(zhuǎn)變?yōu)樽址?#xff0c;另一些函數(shù)則將其轉(zhuǎn)變?yōu)檎麛?shù)或者浮點(diǎn)數(shù)。假設(shè)fieldContainingString賦予hello值,如下所示:
strdist函數(shù)基于一種特殊的算法【由第三個(gè)參數(shù)定義,edit表示文本類型】來計(jì)算兩個(gè)字符串的相似度。如果在此函數(shù)中輸入了錯(cuò)誤的類型,會(huì)出現(xiàn)以下結(jié)果:
該函數(shù)會(huì)自動(dòng)類型轉(zhuǎn)換,在此是把數(shù)值型轉(zhuǎn)換為字符串。很多時(shí)候這種轉(zhuǎn)換是不可能的【例如:字符串轉(zhuǎn)數(shù)值】,這種情況下,通常會(huì)收到Solr異常提醒。需要明確一點(diǎn),雖然函數(shù)嵌套語法是通用的,但并不是所有的函數(shù)都可以組合成功。
Solr的函數(shù)通用性使得它們可以在Solr的各種核心功能上使用。函數(shù)可以影響相關(guān)度,可以過濾結(jié)果,可以用于排序,也可以對(duì)文檔附加返回的函數(shù)值,甚至可以用在分面上。
三.函數(shù)的搜索
在Solr中執(zhí)行典型的關(guān)鍵詞搜索時(shí),每個(gè)關(guān)鍵詞會(huì)在倒排文檔中查找一遍,通過計(jì)算相關(guān)度得分來決定每個(gè)文檔與關(guān)鍵詞的匹配程度。查詢并不局限于詞項(xiàng)本身,也可以在查詢中插入函數(shù) ,將其視為另一個(gè)關(guān)鍵詞。如下:
該查詢執(zhí)行布爾搜索的關(guān)鍵詞為United States,France,和President,以及一個(gè)返回值為1~100區(qū)間值的函數(shù),這個(gè)函數(shù)用來衡量匹配文檔的新舊程度【文檔越新,返回值越高】。此查詢有如下三個(gè)方面需要特別注意:
1.語法_val_:value用來將一個(gè)查詢函數(shù)【嵌套recip和ord函數(shù)】作為一個(gè)詞項(xiàng)插入到用戶主查詢語句中。
2.函數(shù)查詢默認(rèn)匹配所有文檔。在上面例子中查詢被限制在包含三個(gè)詞項(xiàng)的所有文檔中,函數(shù)查詢作為額外的詞項(xiàng)并沒有改變查詢匹配的文檔結(jié)果數(shù)。
3.一個(gè)查詢的相關(guān)度評(píng)分是查詢中每個(gè)詞項(xiàng)相關(guān)度得分的總和。上面提到的三個(gè)詞項(xiàng)都會(huì)得到各自基于tf-idf【詞頻-逆文檔頻率】相似度計(jì)算的相關(guān)度得分,然而函數(shù)查詢的得分是函數(shù)自身的取值。
_val_的目的是讓越新的文檔相關(guān)度得分越高。具體而言,最新文檔的相關(guān)度得分將獲得100的加分,最舊文檔的相關(guān)度得分將獲得1的加分,其余文檔根據(jù)其新舊程度獲得1~100之間的加分。注意,每個(gè)文檔的最后得分會(huì)經(jīng)過規(guī)范化處理,因此不會(huì)看到實(shí)際的1~100分加到每個(gè)文檔的最后得分中,只會(huì)看到越新的文檔排名提升越多。如果 從查詢中移除函數(shù),Solr的搜索結(jié)果排序會(huì)發(fā)生變化。
在查詢中掛接函數(shù)
上面提到的_val_:"functionName(...)"語法,可以像關(guān)鍵詞那樣插入到查詢的任何位置。Solr包含一個(gè)函數(shù)查詢解析器,通過本地參數(shù){!func}functionName(...)進(jìn)行調(diào)用。兩種方式可以實(shí)現(xiàn)相同的功能:將函數(shù)的值作為一個(gè)詞項(xiàng)添加到查詢中,它的相關(guān)度得分就是函數(shù)本身的值。因此,一下語句是等價(jià)的。
通過向查詢添加函數(shù),可以調(diào)整與查詢匹配的文檔相關(guān)度得分,這個(gè)做法似乎很有用。事實(shí)上,如果想要通過函數(shù)計(jì)算來過濾某個(gè)適合結(jié)果區(qū)間以外的結(jié)果,函數(shù)查詢就不那么有效了。所幸,Solr提供了函數(shù)區(qū)間查詢解析器來解決此類需求。
frange查詢解析器
如果需要對(duì)搜索結(jié)果進(jìn)行過濾,只留下函數(shù)計(jì)算產(chǎn)生特定值的文檔,可以選擇函數(shù)區(qū)間解析器。frange過濾器執(zhí)行一個(gè)特定的函數(shù)查詢,然后過濾掉函數(shù)值落在最低值和最高值范圍之外的文檔。例如:
frange查詢解析器過濾了總價(jià)格在10~15區(qū)間之外的那些文檔,上限和下限通過本地參數(shù)l【最低】和u【最高】來定義。上限和下限是默認(rèn)的,如果只想匹配包含特定值的文檔,可以將l和u的值設(shè)為同一值。另外,上限值和下限值的設(shè)置是可選的,沒有強(qiáng)制要求同時(shí)設(shè)置上下限。如有需要,frange查詢中的本地參數(shù)incll【包含下限】和inclu【包含上限】可設(shè)置為false,這樣可以過濾出不在區(qū)間范圍內(nèi)的文檔。
四.以字段形式返回函數(shù)
所有的函數(shù)輸入,包括常量和字段,在函數(shù)查詢語法中都可視為函數(shù)本身。既然如此,函數(shù)和字段最終都會(huì)返回一個(gè)值,因此在Solr中其他一些地方中用函數(shù)替代字段是可行的。
事實(shí)上,不僅可以計(jì)算每個(gè)文檔對(duì)應(yīng)的函數(shù)值,也可以將文檔的計(jì)算值當(dāng)作偽字段返回。例如:
搜索結(jié)果如下:
Solr搜索結(jié)果向字段列表請(qǐng)求增加一個(gè)函數(shù),會(huì)將一個(gè)新的字段添加到文檔中。這并不是存儲(chǔ)在索引中的真實(shí)字段,但會(huì)像存儲(chǔ)字段一樣返回到文檔。返回到文檔中的偽字段名稱是計(jì)算函數(shù)值的語法,這非常不好,因此,需要為返回值的偽字段名稱自定義別名。如下:
冒號(hào)之前是偽字段的名稱,冒號(hào)之后是計(jì)算偽字段值額函數(shù)。這讓偽字段可以像真實(shí)字段一樣返回函數(shù)值。事實(shí)上,動(dòng)態(tài)計(jì)算的偽字段也可以覆蓋一個(gè)真實(shí)字段。這樣的用例需要在不同用例中的同一個(gè)字段上返回不同的值,例如,基于用戶訪問權(quán)限清空字段,或?yàn)椴煌赜蛱峁└鞣N版本的內(nèi)容翻譯來修改字段值。在返回搜索結(jié)果之前,函數(shù)可以操作任何字段的取值。函數(shù)不僅可以修改返回的文檔字段,還可以改變返回文檔的排序。
五.函數(shù)排序
函數(shù)的排序語法與字段的排序語法的唯一不同之處在于,整個(gè)函數(shù)語法【引用參數(shù)包含全函數(shù)語法】取代了字段名稱:
這個(gè)請(qǐng)求將根據(jù)之前計(jì)算的總價(jià)格進(jìn)行排序【升序】,如果價(jià)格相同,則按照文檔得分降序排序。
六.Solr的可用函數(shù)集
Solr的函數(shù)主要分為4類:數(shù)據(jù)轉(zhuǎn)換函數(shù)、數(shù)學(xué)函數(shù)、相關(guān)度函數(shù)和布爾函數(shù)。
1.數(shù)據(jù)轉(zhuǎn)換函數(shù)
Solr中最常見的函數(shù)是將數(shù)據(jù)從一種格式轉(zhuǎn)換成另一種格式的函數(shù)。例如:map(x, min, max, target):如果x落在最小值與最大值之間,則使用x替換target的值。
常用數(shù)據(jù)轉(zhuǎn)換函數(shù)如下:
2.數(shù)學(xué)函數(shù)
3.相關(guān)度函數(shù)
Solr的相關(guān)度得分默認(rèn)使用DefaultSimilarity類計(jì)算。這個(gè)類使用了來自搜索索引及查詢術(shù)語的多種統(tǒng)計(jì)數(shù)據(jù),以便識(shí)別出與查詢最佳匹配的文檔。Solr的相關(guān)度函數(shù)可以返回單獨(dú)的統(tǒng)計(jì)數(shù)據(jù)供選用。所有關(guān)鍵的相關(guān)度統(tǒng)計(jì)數(shù)據(jù)都包含在內(nèi),例如常見的tf-idf。
例如:
4.距離函數(shù)
有時(shí)計(jì)算兩個(gè)值直接的距離很有用,可能是地球上兩個(gè)坐標(biāo)點(diǎn)的地理距離,也有可能是兩個(gè)點(diǎn)或者向量的幾何距離,甚至是兩個(gè)字符串之間的字符距離。如下:
5.布爾函數(shù)
6.自定義函數(shù)
對(duì)于想執(zhí)行的某些數(shù)據(jù)操作,Solr中可能沒有相應(yīng)的內(nèi)置函數(shù)。別擔(dān)心,Solr的用戶自定義函數(shù)功能十分簡(jiǎn)便。代碼在函數(shù)中執(zhí)行,這意味著可以做很多技術(shù)處理,簡(jiǎn)單的如內(nèi)存計(jì)算到鏈接外部文件,復(fù)雜的如從數(shù)據(jù)源導(dǎo)入更多信息,甚至執(zhí)行一段任意代碼等。自定義函數(shù)唯一的局限是等待函數(shù)計(jì)算完成的時(shí)間。因?yàn)楹瘮?shù)代碼在每個(gè)匹配文檔中執(zhí)行,它需要快速執(zhí)行以便在合理的時(shí)間內(nèi)進(jìn)行搜索響應(yīng)。
例如,創(chuàng)建一個(gè)多字符串拼接的自定義函數(shù)步驟:
1.編寫一個(gè)函數(shù)類。這個(gè)類繼承ValueSource類,保證在搜索索引中的每個(gè)文檔都返回一個(gè)計(jì)算值。
2.編寫ValueSourceParser類,它可以理解自定義函數(shù)的語法,并將它解析為步驟1定義的ValueSource函數(shù)需要的變量。
3.向Solrconfig.xml文件添加一個(gè)XML元素,定義自定義函數(shù)的名稱及ValueSourceParser的位置。當(dāng)自定義函數(shù)通過函數(shù)名稱調(diào)用時(shí),ValueSourceParser類將會(huì)解析ValueSource中的輸入。
6.1通過擴(kuò)展ValueSource實(shí)現(xiàn)自定義函數(shù)
自定義的連接函數(shù)會(huì)擴(kuò)展Solr的ValueSource類。ValueSource通過getValues方法返回一個(gè)FuncationValues對(duì)象。FunctionValues對(duì)象返回Solr索引中自定義函數(shù)任意文檔的計(jì)算值。Java代碼如下:
就輸入?yún)?shù)而言,ConcatenateFunction類接受兩個(gè)ValueSource對(duì)象和一個(gè)代表定界符的字符串。
6.2通過ValueSourceParser解析函數(shù)輸入
在ConcatenateFuncationParser的代碼中,預(yù)設(shè)了兩個(gè)ValueSource輸入【字段、用戶輸入字符串,或者其他函數(shù)】和一個(gè)可選的字符串分界符。ConcatenateFunctionParser讀取查詢請(qǐng)求中的輸入后,創(chuàng)建ConcatenateFunction對(duì)象并導(dǎo)入輸入內(nèi)容。
6.3自定義函數(shù)調(diào)用
創(chuàng)建好自定義連接函數(shù)所需要的兩個(gè)類之后,剩下的工作就是向Solrconfig.xml文件添加一下內(nèi)容,讓Solr知曉新建的函數(shù)。
調(diào)用方式如下:
關(guān)于找一找教程網(wǎng)
本站文章僅代表作者觀點(diǎn),不代表本站立場(chǎng),所有文章非營(yíng)利性免費(fèi)分享。
本站提供了軟件編程、網(wǎng)站開發(fā)技術(shù)、服務(wù)器運(yùn)維、人工智能等等IT技術(shù)文章,希望廣大程序員努力學(xué)習(xí),讓我們用科技改變世界。
[Solr復(fù)雜查詢一:函數(shù)查詢]http://www.zyiz.net/tech/detail-128476.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的java 用来查找输出的函数_Solr复杂查询一:函数查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么检查u盘错误 如何查找U盘错误
- 下一篇: 电脑硬盘检测坏道怎么修复工具 电脑硬盘坏