2015-09-21 84 views
1

我从Lucene 3.6升级到5.3.0,但搜索不想在使用5.3.0时使用我的参数。Lucene查询对象和搜索

这个工作在3.6:

IndexSearcher searcher = new IndexSearcher(IndexReader.open(directory)); 
SimpleAnalyzer analyzer = new SimpleAnalyzer(Version.LUCENE_36); 
QueryParser parser = new QueryParser(Version.LUCENE_36, "contents", 
       analyzer); 
TopDocs topDocs = null; 
Query query = parser.parse(queryString); 
topDocs = searcher.search(query, 1000); 

但在5.3中,编译器要求我使用SrndQuery,但我还是坐上searcher.search方法的错误:

IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory)); 
Analyzer analyzer = new SimpleAnalyzer(); 
QueryParser parser = new QueryParser(); 
TopDocs topDocs = null; 

SrndQuery query = QueryParser.parse(queryString); 
topDocs = searcher.search(query, 1000);//**The method search(Query, int) in the type IndexSearcher is not applicable for the arguments (SrndQuery, int)** 

不确定我在这里做错了什么。有任何想法吗?

P.S.我正在升级,因为我无法从最近索引的某些PDF中获取突出显示的文本。

回答

0

它表明您正在使用环绕声查询解析器,而不是标准查询解析器(如果您打算使用标准解析器,则导入了错误的解析器)。

您遇到的问题是SrndQuery不是真正的lucene查询,因​​此您不能将其运行到搜索器并获取结果。您需要将其转换为lucene查询以使用它进行搜索。这是通过SrndQuery.makeLuceneQueryField方法完成的。你需要创建一个BasicQueryFactory传进去,但是他们很容易构造:

SrndQuery query = QueryParser.parse(queryString); 
BasicQueryFactory factory = new BasicQueryFactory(1000 /*maxBasicQueries*/); 
Query luceneQuery = query.makeLuceneQueryField("myDefaultField", factory); 
topDocs = searcher.search(luceneQuery, 1000); 

有点切注:我还挺想知道,如果你要保持BasicQueryFactory周围,而不是创建每个搜索都有一个新的搜索,但似乎没有必要。在ctor中绝对没有什么可贵的东西,它看起来像solr的SurroundQParserPlugin为它解析的每个查询构造一个新的,所以这样做应该没问题。

+0

+ femtoRgon此代码是基于Web的搜索的一部分,所以我没有打算重复使用,因为它一次只有一个请求。我现在会尝试你的建议。 –

+0

+ femtoRgon工作,谢谢。感谢您的解释。 –