ElasticSearch全文搜索
我尝试在弹性搜索java api上使用正则表达式运行全文搜索。 我的filter是这样的:
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();
谢谢你的帮助。
当文本字符串为空或为null时,此连接方法将引发exception。 您可以像这样使用regexpfilter。
FilterBuilder qFilter = FilterBuilders.regexpFilter("_all",(".*"+q+".*").replace(" ", ".*"));
这是一个有趣的问题。 我找到了类似短语查询和短语匹配的内容: 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();
对不起,我找不到任何解决办法。
您可以尝试构建一个脚本filter(将普通json插入filter而不是java方法)或称为查询filter的东西: http : //www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query -filter.html
我希望它对你有所帮助。
编辑:当然有一个简单的解决方案,但我不知道它是否适合你。
FilterBuilder qFilter= FilterBuilders.regexpFilter( "_all",". *"+Joiner.on(".*").join(text.split(" "))+". *");