2013-07-18 36 views
2

我使用的是lucene.Net版本3.0.3。我想做正则表达式搜索。我尝试下面的代码:如何使用lucene.Net进行正则表达式搜索

// code 

String SearchExpression = "[DM]ouglas"; 

const int hitsLimit = 1000000; 

//state the file location of the index 
string indexFileLocation   = IndexLocation; 
Lucene.Net.Store.Directory dir = Lucene.Net.Store.FSDirectory.Open(indexFileLocation); 

//create an index searcher that will perform the search 
Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(dir); 

var analyzer = new WhitespaceAnalyzer(); 

var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, new[] {     
      Field_Content, }, analyzer); 

Term t = new Term(Field_Content, SearchExpression); 
RegexQuery scriptQuery = new RegexQuery(t); 

string s = string.Format("{0}", SearchExpression); 

var query = parser.Parse(s); 

BooleanQuery booleanQuery = new BooleanQuery(); 
booleanQuery.Add(query, Occur.MUST); 

var hits = searcher.Search(booleanQuery, null, hitsLimit, Sort.RELEVANCE).ScoreDocs; 


foreach (var hit in hits) 
{ 
    var hitDocument = searcher.Doc(hit.Doc); 

    string contentValue = hitDocument.Get(Field_Content); 
} 

// end of code 

当我试着使用彭定康"Do*uglas"搜索,我得到的结果。

但是,如果我用它给我下面的错误模式"[DM]ouglas]"搜索:

"Cannot parse '[DM]ouglas': Encountered " "]" "] "" at line 1, column 3. Was expecting one of: "TO" ... <RANGEIN_QUOTED> ... <RANGEIN_GOOP> ...". 

我也试着做这样".ouglas"简单的搜索模式,这应该给我的结果,正如我在我的文字内容有"Douglas"

有谁知道如何使用lucene.Net 3.0.3版进行正则表达式搜索?

回答

2

StandardQueryParser完全不支持正则表达式。相反,它试图将该部分查询解释为范围查询。

我希望使用正则表达式进行搜索,您需要手动构建RegexQuery。请注意,RegexQuery的表现往往很差。您可能可以通过从JavaUtilRegexCapabilities切换到JakartaRegexpCapabilities来改善它。

+0

感谢femToRgon。我尝试了你提到的解决方案。我手动构建了RegexQuery,它工作正常。 –