[英]SOLR/Lucene: How would one go about extending the Scorer class s.t. it could then be wrapped in a Solr plugin
[英]Solr/Lucene Scorer
我們目前正在為使用Solr的客戶進行概念驗證,並且能夠配置除評分之外的所有功能。
問題是他們想要得分使結果落在桶中:
我們做的第一件事就是開發一個自定義相似度類,它會根據字段和精確或部分匹配返回正確的分數。
現在唯一的問題是,當文檔在類別和名稱上匹配時,分數會加在一起。
示例:搜索“餐館”會返回類別餐廳中的文檔,這些文檔在其名稱中也包含“餐廳”字樣,因此得分為5(4 + 1),但它們只能得到4。
我假設為了這個工作,我們需要開發一個自定義的Scorer類,但我們不知道如何在Solr中加入它。 另一種選擇是創建一個類似於Solr中已存在的RandomSortField的自定義SortField實現。
也許甚至還有一個我們不了解的簡單解決方案。
歡迎所有建議!
記分器是通過'權重'查詢方法的lucene查詢的一部分。
簡而言之,框架調用Query.weight(..)。scorer(..)。 看一下
http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Query.html
http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Weight.html
http://lucene.apache.org/jva/2_4_0/api/org/apache/lucene/search/Scorer.html
要在Solr中使用自己的Query類,您需要實現自己的solr QueryParserPlugin,它使用您自己的QParser生成以前實現的lucene Query。 然后,您可以在此處指定的Solr中使用它:
http://wiki.apache.org/solr/SolrPlugins#QParserPlugin
這部分實現應該保持簡單,因為這只是一些粘合代碼。
享受黑客索爾!
您可以覆蓋邏輯solr得分者使用的。 Solr使用DefaultSimilarity類進行評分。
public class CustomSimilarity extends DefaultSimilarity { public CustomSimilarity() { super(); } public float tf(int freq) { //your code return (float) 1.0; } public float idf(int docFreq, int numDocs) { //your code return (float) 1.0; } }
<similarity class="<your package name>.CustomSimilarity"/>
您可以在此處查看影響分數的各種因素
根據您的要求,如果您的分數在特定范圍內,您可以創建存儲桶。 另請閱讀有關現場助推,文檔提升等信息。這可能對您的情況有所幫助。
謝謝你上面的好答案。 在Solr 4.2.1中進行設置后,只需添加它們,即允許每個字段的相似性。 (在Solr 4之前,您只能改變全局所有字段的相似性。)
假設我們希望Solr不對特定字段使用逆文檔頻率(idf) - 我們應該為此編寫自己的自定義相似度,如上所述:
package com.mycompany.similarity;
import org.apache.lucene.search.similarities.DefaultSimilarity;
public class NoIDFSimilarity extends DefaultSimilarity
{
@Override
public float idf(long docFreq, long numDocs)
{
return 1.0f;
}
@Override
public String toString()
{
return "NoIDFSimilarity";
}
}
然后在我們的schema.xml中定義一個新的fieldType,如下所示:
<fieldType name="int_no_idf"
class="solr.TrieIntField"
precisionStep="0"
positionIncrementGap="0"
omitNorms="true">
<similarity class="com.mycompany.similarity.NoIDFSimilarity"/>
</fieldType>
並在像這樣的字段上使用它:
<field name="tag_id_no_idf"
type="int_no_idf"
indexed="true"
stored="false"
multiValued="true" />
如果我們只做了這么多,那么你將得到以下異常:
SEVERE: Unable to create core: SimilarList
org.apache.solr.common.SolrException: FieldType 'int_no_idf' is configured with a similarity, but the global similarity does not support it: class org.apache.solr.search.similarities.DefaultSimilarityFactory
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:466)
at org.apache.solr.schema.IndexSchema.<init>(IndexSchema.java:122)
at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:1018)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1051)
at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:634)
at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:629)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Apr 25, 2013 5:02:08 PM org.apache.solr.common.SolrException log
SEVERE: null:org.apache.solr.common.SolrException: Unable to create core: SimilarList
at org.apache.solr.core.CoreContainer.recordAndThrow(CoreContainer.java:1672)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1057)
at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:634)
at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:629)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.solr.common.SolrException: FieldType 'int_no_idf' is configured with a similarity, but the global similarity does not support it: class org.apache.solr.search.similarities.DefaultSimilarityFactory
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:466)
at org.apache.solr.schema.IndexSchema.<init>(IndexSchema.java:122)
at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:1018)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1051)
... 10 more
谷歌搜索引導您到此 ,所以只需在schema.xml中添加此行,該行將應用於其余字段:
<similarity class="solr.SchemaSimilarityFactory"/>
(從該鏈接:但請記住,coord和queryNorm(= 1.0f)現在沒有實現,因此您將獲得TF-IDF的不同分數!)
我相信Solr的DisMaxRequestHandler可以幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.