2012-12-03 32 views
1

對於腳本,我需要將廣告標題與lucene索引進行比較。
此索引包含幾個關鍵字以及廣告匹配時採取的操作。查詢匹配字段中的所有標記,而不是任何

例如:

(keyword,action,new_category,optional) 
"red volvo","recategorize","cars","red" 

的想法是,我需要對查詢關鍵字字段整個廣告標題。這兩個(查詢和索引)是用我自己的分析器進行分析,它具有詞幹,縮小等。

我遇到的問題是部分匹配。例如:
「我賣紅馬」是匹配「紅色沃爾沃」。

如果它是周圍的其他方式(廣告被收錄,我需要通過關鍵字來查詢),我可以這樣做:

q=+red +volvo 

但是,這不是一種選擇,由於廣告量巨大我需要處理。

那麼,具體問題是否有辦法強制字段中的所有令牌與查詢進行匹配?
我可以使用KeywordAnalyzer,因此整個'紅色沃爾沃'被視爲一個令牌,但我無法將整個廣告標題分析爲單個關鍵字,因爲它不會匹配任何內容。

+0

我不太確定我是否正確理解這一點。你有一個文件字段來搜索哪個包含完整的「紅色沃爾沃」,並且在查詢時,你不希望看到與查詢匹配的內容:「我賣的是一匹紅色的馬」,但是你想要與該查詢:「我賣的是一匹擁有藍色沃爾沃的紅馬。」是對的嗎? – femtoRgon

+0

@femtoRgon最好這兩個詞應該是一個緊挨着另一個,但如果這是不可能的,我可以同時出現在任何地方的兩個詞。 –

回答

0

既然你想趕上短語「紅色沃爾沃「確切地說,但絕不僅僅是」紅色「或」沃爾沃「,那麼我認爲你使用關鍵字分析器將其編入索引的正確軌道。但是,您希望使用比搜索字段更長的查詢進行搜索,這與典型用例相反。

我毫不猶豫地推薦它,但我認爲這個查詢的正確方法可能是使用不同的分析器來查詢,而不是用來創建索引的分析器。

如果索引的短語具有可預測的大小(例如2-5個單詞),那麼使用ShingleFilter可以從長查詢中生成所需的術語,以便將其搜索爲關鍵字。

事情是這樣的:

Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36); 
analyzer = new ShingleAnalyzerWrapper(analyzer, 1, 5); //wrapper that adds a ShingleFilter to the analyzer 
QueryParser parser = new StandardQueryParser(analyzer); 
Query query = parser.parse(query, defaultField); 
searcher.search(query, 10); 

這將拆分只在空格,然後生產出長度爲1至5個標記的搜索字詞,所以這個例子:「我賣一個紅色的馬」是意志產生像「我」,「上午」,「我是」,「紅馬」,「我賣」,「正在賣紅馬」等術語。

我認爲一個空白過濾器可能是使用關鍵字進行此項工作的最佳選擇,但如果您運行的是空格字符而不是空格或多行空格,則可能會遇到問題。

+0

每個木偶將被視爲單個標記嗎? (因爲它是一個關鍵字,即使有空間)。 –

+0

是的,沒錯。再次記住,查詢將被標記爲以空格爲單位的單詞,然後空格將被ShingleFilter重新插入,因此我提到的關於不一致空白的問題。 KeywordAnalyzer根本沒有標記,所以沒有什麼會改變它的空白(這樣的東西就是爲什麼你通常不希望使用不同的分析器進行查詢分析和索引)。在索引上實現一些標準化可能是一個好主意,以確保這不會成爲問題。 – femtoRgon

+0

我實際上做了一些不同的事情,但這似乎是一個很好的方法。我基本上採用了最匹配的文檔,對空白進行了分割,並檢查是否所有單詞都在查詢中。由於我有自己的外部分析器,我可以從標題和匹配關鍵字中獲取標記,然後進行比較。 –

0

聽起來像是你可以使用Lucene的MemoryIndex:「這個班的目標全文搜索查詢的數量巨大的在相當小的瞬態實時數據(預期搜索)」

+0

任何示例或註釋爲什麼?我找不到任何指定MemoryIndex可以執行我想要的查詢類型的任何內容。 –

+1

我不認爲這解決了這個問題。 MemoryIndex(小,通常是臨時的)在RAM中創建索引,而不是存儲在磁盤上。它不會改變它被查詢的方式。 – femtoRgon

+0

@femtoRgon的確如此。我當然已經使用了一個RAMDirectory,我認爲它的工作原理類似。 –

相關問題