2014-09-10 170 views
2

我嘗試在彈性搜索java api上使用正則表達式運行全文搜索。我的過濾器是這樣的:ElasticSearch全文搜索

FilterBuilder qFilter= FilterBuilders.regexpFilter("_all", 
". *"+text+". *"); 

但它只匹配一個單詞而不是一個短語。我的意思是,例如:

如果在像soruce的字符串:「one two three four five..」當我的文本字符串是這樣的:「two」,「our」,「thr」 ...然後作品。

但是,當我的realTimeTextIn字符串是「two three」全文檢索不起作用。我無法搜索一個以上的單詞。

我在這裏錯過了什麼?

代碼的其餘部分是這樣的:

FilterBuilder qFilter  = FilterBuilders.regexpFilter("_all", ".*"+q+".*"); 
    SearchResponse response = ClientProvider.instance().getClient().prepareSearch(index) 
         .setTypes(type) 
         .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)        
         .setPostFilter(qFilter)     
         .setFrom(0).setSize(250).setExplain(true)  
         .execute() 
         .actionGet(); 

感謝幫助。

+0

有matchPhrasePrefixQuery方法,它的工作原理,但我不能用它與正則表達式。 – rLyLmZ 2014-09-11 07:48:45

回答

2

當文本字符串爲空或null時,此連接方法會拋出異常。 你可以像這樣使用regexp過濾器。

FilterBuilder qFilter = FilterBuilders.regexpFilter("_all",(".*"+q+".*").replace(" ", ".*")); 
1

這是一個有趣的問題。我發現類似短語查詢和詞組匹配: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/phrase-matching.html http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_phrase_search.html

在的Java API,我們可以查詢做到這一點(我測試了這一點):

SearchResponse response = client.prepareSearch(index) 
      .setTypes(type) 
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
      .setFrom(0).setSize(250).setExplain(true).setQuery(QueryBuilders.matchPhraseQuery(field, "one two")) 
      .execute() 
      .actionGet(); 

我很抱歉,但我沒有找到解決辦法。

您可以嘗試建立一個腳本過濾器(插入普通的JSON到過濾器,而不是Java方法),或者一些所謂的查詢過濾器: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-filter.html

我希望它幫你一點點。


編輯: 當然有一個簡單的解決方案,但我不知道它是否讓你滿意。

FilterBuilder qFilter= FilterBuilders.regexpFilter(
"_all",". *"+Joiner.on(".*").join(text.split(" "))+". *"); 
+0

感謝您的回覆,您將引導我們找到解決方案。 – rLyLmZ 2014-10-09 12:28:03