Lucene 4.5。在StringField中搜索多词查询

法布里佐·西尔维斯特里(Fabrizio Silvestri)

我正在尝试查询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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章