我绝对不同意你目前的方法是丑陋的。我发现将所有内容收集到所有字段中是启用随处查找搜索的最简洁方法。
但是,如果您手动连接字段,那可能会有点混乱。相反,您可以添加多个具有相同名称的字段,这些字段都将在索引中有效连接。就像是:
//Don't actually construct your fields this way.
//Just cutting out some of the boilerplate for simplicity.
document.add(new Field("field1", firstvalue));
document.add(new Field("everything", firstvalue));
document.add(new Field("field2", nextvalue));
document.add(new Field("everything", nextvalue));
可以很好地把它全部放到同一个领域。一般来说,只要不存储“一切”字段(当然不应该存储),这对索引大小的影响应该很小,并且应该表现良好。我之前刚刚创建了一个实用程序调用,该调用将字段添加到文档中,并将其透明地添加到“所有”或“所有”字段中,以用于任何被索引的内容。
查看 Solr 文档,他们通过使用他们的模式元素来推荐这种模式,以应对这种情况。copyField
如果您真的想使用MultiFieldQueryParser
,您可能需要单独解析子查询,并使用 booleanQuery 将它们连接起来,例如:
BooleanQuery bq = new BooleanQuery();
bq.add(new BooleanClause(multifieldQP.parse("hello"), BooleanClause.Occur.MUST));
bq.add(new BooleanClause(multifieldQP.parse("world"), BooleanClause.Occur.MUST));
searcher.search(bq);
但是,如果用户输入了查询来自动处理它,那么分解查询会很复杂。同样,我会坚持你目前正在做的事情。