我正在尝试查询StringField以查找由Lucene 4.5创建的索引,该索引具有由多个术语组成的字符串。
让我们假设我们使用以下代码段/伪代码创建一个Document对象。
Directory dir = FSDirectory.open(new File(indexPath));
Analyzer analyzer = new EnglishAnalyzer(Version.LUCENE_45);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_45, analyzer);
iwc.setOpenMode(OpenMode.CREATE);
IndexWriter writer = (dir, iwc);
Document doc = new Document();
Field title = new StringField("Title", minQuery, Field.Store.YES);
doc.add(title);
writer.addDocument(doc);
现在,假设我使用以下查询代码来查询上述创建索引(同样,这只是我正在使用的实际代码的草图):
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexPath)));
BM25Similarity bm25sim = new BM25Similarity();
IndexSearcher searcher = new IndexSearcher(reader);
searcher.setSimilarity(bm25sim);
Analyzer analyzer = new EnglishAnalyzer(Version.LUCENE_45);
QueryParser parser = new QueryParser(Version.LUCENE_45, "Content", analyzer);
Query query = parser.parse("Title:\"washington dc\"");
TopDocs result = searcher.search(query, 1);
当我运行上面的代码时,对应于searcher.search(query,1)语句,出现以下异常:
Exception in thread "main" java.lang.IllegalStateException: field "Title" was
indexed without position data; cannot run PhraseQuery (term=washington)
我环顾四周,找不到解决此问题的方法。看起来在Lucene的早期版本中,您可以将Field.Index.ANALYZED选项添加到字段创建中,但是在我的情况下,我无法执行类似的操作。
任何的想法?
您的查询被分析为全文,而不是一个原子字符串。为了让查询分析器对适宜分析仪用于不同领域的有效决定,您可以使用PerFieldAnalyzerWrapper
,与KeywordAnalyzer
是否在适当的分析仪适用于一个StringField
。
Map<String,Analyzer> analyzerMap = new HashMap<String,Analyzer>();
analyzerPerField.put("Title", new KeywordAnalyzer());
PerFieldAnalyzerWrapper analyzer =
new PerFieldAnalyzerWrapper(new EnglishAnalyzer(Version.LUCENE_45), analyzerMap);
QueryParser parser = new QueryParser(Version.LUCENE_45, "Content", analyzer);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句