Lucene查询对象和搜索

时间:2015-09-21 16:50:10

标签: java lucene

我正在从Lucene 3.6升级到5.3.0,但搜索在使用5.3.0时并不想使用我的参数。

这适用于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中获得突出显示的文本。

1 个答案:

答案 0 :(得分:0)

可以说你正在使用Surround查询解析器,而不是标准的查询解析器(如果你打算使用标准的解析器,那么你输入的是错误的解析器)。

您遇到的问题是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为它解析的每个查询构造一个新的,所以这样做应该没问题。

相关问题