2013-01-03 59 views
0

我正在使用Lucene.net 3.0版API爲我的項目創建和搜索索引。在我的索引中的每個文件有三個領域:使用MultiFieldQueryParser對特定術語進行通配符搜索

  • TRANSACTIONID
  • 代理
  • 貸款

我的要求是這樣的:

  1. 我想一擊,如果一個搜索詞匹配文檔的 val的第一部分 ue爲TransactionId。例如,如果我搜索「ab」,則 與TransactionId等於「ab-1」或「ab-2」的文檔將爲 匹配。

  2. 我只想命中時完整的搜索字詞匹配代理貸款。 搜索「ab」將而不是 return 貸方爲「ab-1」或「ab-2」的值的文檔。

到目前爲止,我有下面的代碼塊:

var searcher = new IndexSearcher(FSDirectory.Open(path)); 
var parser = new MultiFieldQueryParser(Version.LUCENE_30, 
new[] {"TransactionId", "Agent", "Lender"}, 
new StandardAnalyzer(Version.LUCENE_30)); 

var query = parser.Parse(queryText); 
var hits = searcher.Search(query, 200); 

如果queryText爲「AB」,那麼查詢的值是{TransactionId:ab Agent:ab Lender:ab}

我知道我在尋找它有點像{TransactionId:ab* Agent:ab Lender:ab}

有沒有辦法用MultiFieldQueryParser做到這一點?

回答

1

你可以通過子類MultiFieldQueryParser來達到這個目的。

以下似乎可行,也許你可以建立。請注意,解析布爾查詢應該是遞歸的,因爲最終可能會最終嵌套查詢。

聲明:此代碼心不是優雅和可能打破很容易的,它的打算作爲一個簡單的例子

public class WildCardForFieldQueryParser : MultiFieldQueryParser 
    { 
     public WildCardForFieldQueryParser(Lucene.Net.Util.Version version, 
              string [] fields, 
              Analyzer analyzer, 
              HashSet<string> wildcardFields) 
      :base(version, fields, analyzer) 
     { 
      this._wildcardFields = wildcardFields; 
     } 

     public override Query Parse(string query) 
     { 
      // clause replacement should be recursive 
      Query q = base.Parse(query); 
      if (q is BooleanQuery) 
      { 
       foreach (var clause in q as BooleanQuery) 
       { 
        if (clause.Query is TermQuery && this._wildcardFields.Contains(((TermQuery)clause.Query).Term.Field)) 
        { 
         clause.Query = new PrefixQuery(new Term(((TermQuery)clause.Query).Term.Field, ((TermQuery)clause.Query).Term.Text)); 
        } 
       } 
      } 
      return q; 
     } 
     private HashSet<string> _wildcardFields; 
    }