2017-07-29 49 views
0

我正在創建一個索引,其中的文檔只是一個單詞。 我索引的域名,所以場「域」看起來像:如何在lucene中只有一個字段的單個令牌進行搜索

example.com 
thisiscool.com 
justtesting.org 
cnn.com 

我創造我的搜索字詞等編程,因爲我所有的文檔場只是一個名詞,它看起來好像我的搜索將無法正常工作,因爲只有一個詞,如果我在布爾查詢中添加多個詞,它將永遠不會找到任何內容。

我應該如何搜索因爲我只有一個詞?我想盡可能提高效率。

Query term = new TermQuery("domain", "this") 
Query term2 = new TermQuery("domain", "cool") 

// add to boolean query 
bq.add(term, Occur.MUST) 
bq.add(term2, Occur.MUST) 

indexSearcher.search(bq, 100) 

我期待得到 「thisiscool.com」 回來了,但我得到0命中。我的猜測是,因爲lucene不能將事物分解爲令牌,所以它永遠不會找到任何既有「this」也有「cool」的文檔。

我應該如何搜索這個scenerio?

回答

1

將通配符應用於您的搜索條款。

Query term = new TermQuery("domain", "this*"); 
Query term2 = new TermQuery("domain", "cool*"); // *cool* won't work sadly 

但是,因爲邏輯是要造成這樣的查詢,該域必須首先「這個」以及「酷」

bq.add(term, Occur.MUST) 
bq.add(term2, Occur.MUST) 

=> +domain:this* +domain:cool* 

Query term = new TermQuery("domain", "this*cool*"); 

=> +domain:this*cool* // probably gets hits 

,可能無法正常工作 如果您在使用新版本,那麼你可以在查詢中使用正則表達式: http://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/automaton/RegExp.html


上面的例子實際上並不是你應該這樣做的。我測試了一下,甚至沒有真正的工作。你想要做的是建立專門的查詢,如PrefixQueryWildcardQueryRegexpQuery

此外,如果您未使用QueryParser或需要Analyzer的東西,則查詢必須完全匹配索引中的內容。如果域名是TextField,它可能已經被小寫或者發生了其他事情,所以你也需要知道。

我只是使用正則表達式。

RegExp r = new RegExp("this.*cool"); 
Query q = new RegexpQuery(new Term("domain", r.toString())); 

它可能會很慢,但如果你不用any char作爲前綴,它應該是非常好的。我也不完全確定如何忽略這種情況,但這可能是默認情況。

+0

我建議在這種情況下使用前綴查詢與布爾查詢結合使用。自己添加通配符對我來說看起來不太合適。 – dom

+0

@你說得對,我其實在這裏有點困惑。我會編輯我的答案。 – jake

相關問題