我正在从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中获得突出显示的文本。
答案 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
为它解析的每个查询构造一个新的,所以这样做应该没问题。