ElasticSearch全文搜索

时间:2014-09-10 12:27:10

标签: java regex lucene elasticsearch

我尝试在弹性搜索java api上使用正则表达式运行全文搜索。我的过滤器是这样的:

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

但它只与一个单词匹配而不是短语。我的意思是,例如:

如果句子中有一个字符串,如:" 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();

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

当文本字符串为空或null时,此连接方法抛出异常。 您可以像这样使用regexp过滤器。

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

答案 1 :(得分: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(" "))+". *");

答案 2 :(得分:0)

我碰巧使用查询生成器进行了全文搜索

QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(query)
              .field("name", 2.0f)
              .field("email")
              .field("title")
              .field("jobDescription", 3.0f)
              .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);