2015-09-17 68 views
1

我需要搜索lucene索引中的任何術語,以匹配特定的正則表達式。我知道我可以使用TermsComponent Solr中做到這一點,如果是的ConfigEd這樣的:LUCENE:搜索匹配正則表達式的術語

<searchComponent name="terms" class="solr.TermsComponent"/> 

    <!-- A request handler for demonstrating the terms component --> 
    <requestHandler name="/terms" class="solr.SearchHandler" startup="lazy"> 
    <lst name="defaults"> 
     <bool name="terms">true</bool> 
     <bool name="distrib">false</bool> 
    </lst>  
    <arr name="components"> 
     <str>terms</str> 
    </arr> 
    </requestHandler> 

例如,我想獲得一個包含「表面缺陷」的任何條款。使用Solr的我能做到這一點:

http://localhost:8983/solr/core1/terms?terms.fl=content& 
     terms.regex=^(.*?(\bsurface%20defects\b)[^$]*)$& 
     terms.sort=count& 
     terms.limit=10000 

但我的問題是,我怎麼能使用Lucene的API實現相同的,不SOLR?我看了一下org.apache.solr.handler.component.TermsComponent班,但對我來說這不是很明顯。

回答

2

你可以使用一個RegexQuery

Query query = new RegexQuery(new Term("myField", myRegex)); 

還是QueryParser

String queryString = "/" + myRegex + "/"; 
QueryParser parser = new QueryParser("myField", new KeywordAnalyzer()); 
Query query = parser.parse(queryString); 

現在,我的問題是:你肯定在Solr的正則表達式的作品?

我沒有試過TermsComponent正則表達式的功能,所以也許它在這裏做一些花哨SpanQuery步法,或運行在存儲領域正則表達式檢索,或類似的東西,但你正在使用正則表達式語法,支持由Lucene提供,並且可能會對一些關於regexes在Lucene中的工作原理做出一些假設,這些假設並不準確。

  • 大問題:lucene的正則表達式查詢必須匹配整個術語。如果你的領域沒有被分析,這裏的一般想法應該工作。如果使用StandardAnalyzer進行分析,則不能使用正則表達式查詢來像這樣進行搜索,因爲「表面缺陷」將被拆分爲多個術語。另一方面,在這種情況下,一個簡單的PhraseQuery可能會工作得很好,而且更快更簡單(一般來說,在Lucene正則表達式查詢中:你可能不需要它們,如果你這樣做,你可能應該分析得更好)。

  • ^$將不起作用。您正在嘗試匹配術語,並且必須匹配整個術語才能匹配。因此,這些不起任何作用,並且不被支持。

  • .*?不是真的錯誤,但不支持不願意匹配,所以它是多餘的。 .*在這裏做同樣的事情。

  • [^$]*如果你試圖不匹配美元符號,罰款,否則,我不知道什麼正則表達式引擎支持這一點。字符類中的$只是一個美元符號。

  • \b在lucene正則表達式中不支持。整個分析的想法是,內容應該已經在分詞時分裂了,所以這樣做的目的是什麼?