当前位置: 首页 > 知识库问答 >
问题:

Lucene:搜索没有特定字段的文档

嵇昱
2023-03-14
class familyMember {
   String id;
   String name;
   String parentId; // Id of familyMember object which is parent of this member
}
if (parentId != null) {
    Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
    QueryParser queryParser = new QueryParser(LUCENE_VERSION, "parentId"), analyzer);
    queryParser.setAllowLeadingWildcard(true);
    Query parentIdQuery = queryParser.parse("%%");
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST_NOT);
}

编辑1:我也试过这个,但同样的问题。

if (parentId != null) {
    Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
    Query parentIdQuery = new TermQuery(new Term("parentID", "%%"));
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST_NOT);
}

共有1个答案

吕天逸
2023-03-14

好的,我找到解决办法了。诡计在里面

new ConstantScoreQuery(new FieldValueFilter());

解决方案:

if (parentId != null) {
    Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
    Query parentIdQuery = new ConstantScoreQuery(new FieldValueFilter("parentID", true));
    booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);

}

 类似资料:
  • 我必须将此添加到我执行的每个搜索查询中。我有一个大约20,000个文档的索引,我真的不想重建它,因为我在上一个版本中让我的用户重建了他们的索引。注意:这是在android设备上,所以需要很长的时间和大量的电池来重新索引他们的所有文档。 谢谢你的帮助。

  • 我在我的应用程序中使用Hibernate搜索。其中一个子集合映射为IndexeDemBedded。子对象有两个字段,一个是id,另一个是date(使用date resoultion到毫秒)。当我搜索ID=1(或某个值)并且date等于另一个值时,我会得到第一个和第二个匹配的所有情况的结果。我只想在同一个孩子中获得两个字段匹配的记录,但我在不同的孩子中获得匹配,结果会高得多。下面是代码片段 主类是用

  • 如何告诉Elasticsearch在按术语搜索时排除某个字段? 当一个普通用户搜索摩托车时,什么都不应该返回,但如果他们搜索史密斯,这两个都应该返回。 有能力搜索认证字段的用户如果搜索摩托车将返回标记,如果搜索史密斯将返回标记。

  • 我使用的是OrientDB 2.1.8社区和内置的Lucene索引。如何在手动索引中定义在搜索过程中要使用的字段?即。按照文档中使用多个字段页面中描述的方式使用手动索引? 下面是一个简短的例子来展示我正在努力做的事情。

  • 问题内容: 是否可以在每个表的每个字段中搜索Oracle中的特定值? 有几百个表,有些表中有成千上万的行,因此我知道这可能需要很长时间才能查询。但是我唯一知道的是我要查询的字段的值是1/22/2008P09RR8。< 我已经尝试过使用以下语句根据我认为应命名的内容找到合适的列,但未返回任何结果。 这个数据库上绝对没有文档,我也不知道该字段是从哪里提取的。 有什么想法吗? 问题答案: 引用: 我已尝

  • 版本字符串有一个支持java类(版本),它实现了Comparable。 我的分析器是一个分析器包装器,它是一个小写和空格分析器,类似于内置的分析器。我使用经典的查询解析器进行搜索。在确切的条件下搜索工作良好。 我想做的是: 我试图在索引之前将版本字符串转换为int,但查询输入需要以某种方式转换,以便在搜索之前将版本字符串转换为int。 看起来我必须为version字段实现一个自定义分析器,但是我在