簡體   English   中英

Lucene的。 為文本中的每個單詞索引幾個標記

[英]Lucene. index a few tokens for each word in the text

我將Lucene 3.5與SpanishAnalyzer一起使用 (其本身使用SpanishStemmerStandardTokenizer )。
當SpanishAnalyzer用(例如)“ claramente”和“ claro”這兩個詞索引文檔時,它們都將被索引為“ clar”。
今天,這種行為已被理解並且對我的需求有用。在查詢之前,我今天使用分析器的tokenStream + incrementToken()令牌incrementToken()來獲取我的搜索詞的標記並針對索引文檔進行搜索。 我不使用QueryParser,而是在代碼中構建Lucene查詢對象。
但是,我希望能夠搜索准確的單詞(在此示例中為claro),而又不會失去SpanishAnalyzer的形態學功能。
我可以跳過上面的步驟(tokenStream),直接搜索“ claro”,但是找不到,因為它被索引為“ clar”。
另外,我也不想使用2個不同的分析器對字段進行兩次索引,因為我需要能夠使用包含一個確切詞和一個正則項(詞法)的PhraseQuerySpanNearQuery
所以...到了重點...我想修改Tokenizer或Stemmer或Filter(?),以便在索引時間上將為每個單詞索引2個標記,其中一個詞是原始詞,在本例中為“ claro” “和” clar“,稍后在查詢時,我可以選擇使用確切的單詞還是詞干標記。
我需要幫助來了解如何(以及在​​何處)可以執行此操作,我想應該在Stemmer中的某個位置進行編輯。

順便說一句,我使用希伯來語分析器做的完全一樣,當使用incrementToken()令牌incrementToken()時,它為文本中的每個單詞返回多個令牌(但我沒有源代碼)

您需要每個位置具有多個標記的索引,因為您要搜索詞干和非詞干(=原始)標記混合的短語。 我將回答5.3版,但3.5版差別不大。

查看solr中ReversedWildcardFilter的源代碼。 您將在每個令牌上看到兩個步驟:

  1. 使用原始令牌存儲當前狀態 因此,第一次調用遞增令牌()方法將獲取詞干令牌,第二次調用將獲取原始令牌(位置相同)
  2. 選擇“ markerChar”作為詞干標記的前綴。 因此,在搜索時,您可以決定是否要使用詞干或原始令牌進行搜索。

對於您的SpanishAnalyzer,這將意味着例如以下內容:

SpanishAnalyzer的核心是SpanishLightStemFilter。 SpanishLightStemFilter僅使用!KeywordAttribute.isKeyword()阻止了令牌。 因此,對於索引時間,在SpanishAnalyzer中插入KeywordRepeatFilter並用前綴標記詞干標記。

有一個令牌過濾器可以很容易地啟用此功能, KeywordRepeatFilterSpanishLightStemFilter 確實尊重KeywordAttribute)。 只需將其添加到Stemmer之前的分析鏈中即可。 對於SpanishAnalyzer, createComponents方法如下所示:

@Override
protected TokenStreamComponents createComponents(String fieldName) {
    final Tokenizer source;
    if (getVersion().onOrAfter(Version.LUCENE_4_7_0)) {
        source = new StandardTokenizer();
    } else {
        source = new StandardTokenizer40();
    }
    TokenStream result = new StandardFilter(source);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result, stopwords);
    if(!stemExclusionSet.isEmpty())
        result = new SetKeywordMarkerFilter(result, stemExclusionSet);
    result = new KeywordRepeatFilter(result);
    result = new SpanishLightStemFilter(result);
    return new TokenStreamComponents(source, result);
}

這將不允許您顯式搜索沒有詞干的詞 ,但是會將原始詞與詞干保持在相同的位置,從而可以輕松地將它們用作詞組查詢。 如果確實只需要顯式搜索詞干或不詞干的詞,那么在單獨的字段中建立索引確實是更好的方法。

暫無
暫無

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

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