Lucene - 相当于SQL" IN"关键词

时间:2015-06-24 14:28:15

标签: java lucene

请原谅我的新手问题。我试图寻找答案,但鉴于关键字......

,搜索这类事情非常困难

我使用Lucene 5.2.x索引一组文档,每个文档都有两个字段:iddescription

我从系统中的先前查询中获取了一组ids。现在,我想在description上获取Lucene文本搜索结果,但仅限于ids集中的文档。如果我在MySQL中这么做(天真),我可能会做类似的事情:

SELECT * FROM mytable 
    WHERE description LIKE 'blah%' 
          AND 
          id IN (6345, 5759, 333, ...)

ids的集合可能是成千上万。 Lucene最好的解决方法是什么?我可以构建一个Lucene查询来有效地处理这个问题,还是应该搜索整个文档索引然后进行集合交集?还有别的吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我想在描述中获取Lucene文本搜索结果,但仅限于package code; public class Help { public String x2y(String s, int x, int y) { String answer = ""; for (int i = 0; i<s.length(); i = i+1){ char ch = s.charAt(i); return answer; } } } 集中的文档。

您需要使用ids

如果使用BooleanQuery创建查询,请使用:

QueryParser

如果以编程方式创建+(id:6345 id:5759 id:333 ...) +(description:"blah*") ,则代码将类似于:

Query
  

BooleanQuery ids = new BooleanQuery(); ids.add(new TermQuery(new Term("id", "6345")), SHOULD); ids.add(new TermQuery(new Term("id", "5759")), SHOULD); ids.add(new TermQuery(new Term("id", "333")), SHOULD); BooleanQuery resultQuery = new BooleanQuery(); resultQuery.add(new PrefixQuery(new Term("description", "blah")), MUST); resultQuery.add(ids, MUST); 可能是成千上万的。

ids已为最大数量的子句构建了限制(请参阅BooleanQuery)。您需要使用org.apache.lucene.search.BooleanQuery#maxClauseCount增加此限制。这将要求您以编程方式创建查询。

  

我可以构建一个Lucene查询来有效地处理这个问题,还是应该搜索整个文档索引然后进行集合交集?还有别的吗?

据我所知,倒置索引是最有效的搜索方式,目前人类已知。至少,从搜索时间的角度来看(不考虑索引阶段)。

因此,如果关注效率,我建议将所有搜索逻辑移动到Lucene(它是反向索引库)。作为一个非常成熟的图书馆,Lucene可以搜索几乎所有类型的信息。因此,可能所有文档都可以在Lucene中编入索引,所有“以前的查询”也可以在Lucene中执行。

在这种情况下,不需要向Lucene发送数千个ID作为额外的过滤器,这确实看起来很浪费。除非你有一些独特的搜索要求,否则这是我能提出的最有效的搜索方式。