Lucene QueryParser:解析多项字符串而不进行分析

时间:2015-08-03 01:21:28

标签: lucene

我将使用TermQuery构造的BooleanQuery序列化为字符串。现在我尝试将字符串反序列化为分布式系统中不同节点上的BooleanQuery。因此,在反序列化时,我有多个字段,我不想使用分析器

例如:我试图在不分析

的情况下解析下面的字符串
+contents:maxItemsPerBlock +path:/lucene-5.1.0/core/src/java/org/apache/lucene/codecs/blocktree/Stats.java

lucene中的QueryParser需要一个分析器,但我希望将上述字段值视为术语。我正在寻找一个查询解析器,它执行类似下面的操作,因为我不想解析字符串并自己构造查询。

TermQuery q1 = new TermQuery(new Term("contents", "maxItemsPerBlock"));
TermQuery q2 = new TermQuery(new Term("path", "/lucene-5.1.0/core/src/java/org/apache/lucene/codecs/blocktree/Stats.java"));
BooleanQuery q = new BooleanQuery();
q.add(q1, BooleanClause.Occur.MUST);
q.add(q2, BooleanClause.Occur.MUST);

当我尝试使用带有QueryParser的空白分析器时,我得到了“IllegalArgumentException:field must not null”错误。以下是示例代码

Analyzer analyzer = new WhitespaceAnalyzer();
String field = "contents";
QueryParser parser = new QueryParser(null, analyzer);
Query query = parser.parse("+contents:maxItemsPerBlock +path:/home/rchallapalli/Desktop/lucene-5.1.0/core/src/java/org/apache/lucene/codecs/blocktree/Stats.java");

java.lang.IllegalArgumentException: field must not be null
at org.apache.lucene.search.MultiTermQuery.<init>(MultiTermQuery.java:233)
at org.apache.lucene.search.AutomatonQuery.<init>(AutomatonQuery.java:99)
at org.apache.lucene.search.AutomatonQuery.<init>(AutomatonQuery.java:81)
at org.apache.lucene.search.RegexpQuery.<init>(RegexpQuery.java:108)
at org.apache.lucene.search.RegexpQuery.<init>(RegexpQuery.java:93)
at org.apache.lucene.queryparser.classic.QueryParserBase.newRegexpQuery(QueryParserBase.java:572)
at org.apache.lucene.queryparser.classic.QueryParserBase.getRegexpQuery(QueryParserBase.java:774)
at org.apache.lucene.queryparser.classic.QueryParserBase.handleBareTokenQuery(QueryParserBase.java:844)
at org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:348)
at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:247)
at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:202)
at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:160)
at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:117)

1 个答案:

答案 0 :(得分:1)

考虑您在问题中提供的文字。也许 WhitespaceAnalyzer 可以选择在空白处拆分令牌。

在序列化由TermQuery构造的BooleanQuery之前,TermQuery中的术语实际上是您想要在Lucene索引中匹配的术语。

// code in Scala
val parser = new QueryParser(version, "", new WhitespaceAnalyzer((version)))
val parsedQuery = parser.parse(searchString) 

我尝试了以下两种情况:单值字段和多值字段,都可以工作。

 +contents:maxItemsPerBlock +path:/lucene-5.1.0/core/src/java/org/apache/lucene/codecs/blocktree/Stats.java

 +(contents:maxItemsPerBlock contents:minItemsPerBlock) +path:/lucene-5.1.0/core/src/java/org/apache/lucene/codecs/blocktree/Stats.java

此外,在我们的系统中,基于节点之间的Query传递时的序列化和反序列化 java的ObjectInputStream和ObjectOutputStream。因此,您可以尝试这种方式,这样您就不必考虑分析器了。