我有一个包含大量字段的复杂搜索表单,然后生成一个Solr搜索字符串。我正在寻求建议应该如何做到这一点。 (与SQL中的Prepared语句类似)。
目前我正在考虑这样的事情:
QueryBuilder builder = new QueryBuilder(new WhitespaceAnalyzer());
BooleanQuery query = new BooleanQuery.Builder()
.add(builder.createBooleanQuery("field1", "foba*r"), BooleanClause.Occur.SHOULD)
.add(builder.createBooleanQuery("field2", "fo bar*"), BooleanClause.Occur.SHOULD)
// ...
.add(builder.createMinShouldMatchQuery("mmfield", "foo bar baz", 0.5f), BooleanClause.Occur.SHOULD)
.add(new TermRangeQuery("datefield", new BytesRef("lower"), new BytesRef("upper"), true, true), BooleanClause.Occur.SHOULD)
.add(builder.createBooleanQuery("", "-foo +bar"), BooleanClause.Occur.SHOULD)
.build();
System.out.println(query);
打印field1:foba*r (field2:fo field2:bar*) ((mmfield:foo mmfield:bar mmfield:baz)~1) datefield:[lower TO upper] (-foo +bar)
这似乎是正确的,但是仅仅为了构建一个简单的"而QueryBuilder
,BooleanQuery.Builder
,WhitespaceAnalyzer
感到愚蠢。查询。
如果我遗漏QueryBuilder
那么我将不得不按空格手动拆分用户提供的字符串并从单词中创建一个布尔查询,因为我需要支持通配符,PhraseQueries不支持这些通配符。我知道(例如。" foo ba *")
答案 0 :(得分:1)
您可以使用本地参数替换在单独的变量中发送您的信息,并使预备语句保持Solr端。可能每个语句都有不同的请求处理程序端点。
参见展示复杂查询,多个参数和参数替换的my example for contact form search。
就通配符而言,您可能希望查看SurroundParser,它显然支持通配符。虽然通常通配符不是一个好主意,但计算上。