簡體   English   中英

Apache Solr查詢構建

[英]Apache Solr Query Building

我是Apache Solr的新手。 我正在嘗試為以下查詢找出令牌生成器,過濾器和查詢參數,但還無法確定是否可行(仍在閱讀所有文檔):

我有兩個字段- titledescription 我們想在以下位置進行搜索:
1. title匹配比description匹配更具相關性。
2.完整的單詞匹配優先於所有其他單詞(對於查詢kitkit優先於kitchen )。
3.以查詢字段開頭的索引條目優先於僅包含該字段的索引條目(對於查詢googood優先於Magoo )。

這有可能嗎? 如果是這樣,我該怎么做?

字段之間的權重不是令牌生成器或過濾器關心的問題-它們的工作是獲取一些輸入文本,將其拆分為令牌(令牌),然后通過一系列處理步驟(過濾器)運行它。

edismax和dismax查詢解析器具有一個名為qf的參數,該參數允許您提供應查詢的字段列表,並為每個字段提供單獨的權重-允許您精確調整要賦予每個字段多少權重。 qf=title^5 description會使字段title的命中率比description中的字段高五倍-其他所有內容都是相同的(但它們通常是不相同的,因為您沒有在兩個字段中都索引相同的內容) 。

這就是評分不是一門精確科學的原因,因此,如果您想使用某種相關性分數(即,命中不同的單詞會得到不同的分數),則必須調整這些權重以適合您的排名重新尋找。 在調整得分時,將debugQuery=true附加到查詢中非常有幫助,因為它將准確顯示每個術語對文檔的最終得分有多大作用。

您的第一個條件, titledescription是通過使用帶有StandardTokenizer和小寫過濾器的TextField來解決的(取決於您要查找的內容,還可以是詞干,同義詞等)。

在下面給出的示例中,您也可能(可能)想要一個小寫過濾器,但是為了使示例緊湊,我省略了它。

您的第二種情況是通過使用具有EdgeNGramFilter的第二個字段類型並具有兩個使用此字段類型的新字段title_edgedescription_edge來解決的。

此示例和下面的NGramFilter示例都使用type="index"屬性,因為通常只有在索引時擴展ngram才有意義。 否則,以相同字母開頭(或對於NGram過濾器,包含相同字母)的任何兩個單詞都將匹配。

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="40" />
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>

通過具有第三組字段title_ngramdescription_ngram來解決第三個條件,該字段的順序為NGramFilter:

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.NGramFilterFactory"/>
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>

請注意,NGramFilter將導致生成大量令牌,需要更多的存儲空間,並使搜索在生成匹配項時處理更多的令牌。 這可能與您的用例無關,也可能無關。

話雖這么說,但要匹配單詞中的內部術語(尤其是非常短的字符串)要說些什么。 他們可能會在用戶無法理解為什么匹配文檔的情況下給出結果,因為它可能在某處很小的匹配項(鍵入查詢時為單個字母)。 只需搜索“ c”以找到有關編程語言的內容,就會獲得每個包含c的單詞的匹配(但是,如果您對字段進行了適當的提升,則准確的匹配應該位於頂部)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM