我尝试在弹性搜索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();
感谢您的帮助。
答案 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);