2014-09-10 141 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