我正在尝试创建一个Lucene 4.10索引。我只想在索引中保存我放入文档的确切字符串,无需标记化。
我正在使用StandardAnalyzer。
Directory dir = FSDirectory.open(new File("myDire"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_0, analyzer);
iwc.setOpenMode(OpenMode.CREATE);
IndexWriter writer = new IndexWriter(dir, iwc);
StringField field1 = new StringField("1", content1, Store.YES);
StringField field2 = new StringField("2", content2, Store.YES);
StringField field3 = new StringField("3", content3, Store.YES);
doc.add(field1);
doc.add(field2);
doc.add(field3);
writer.addDocument(doc, analyzer);
writer.close();
如果我打印索引的内容,我可以看到我的数据存储,例如,我的文档有这个“字段3”:
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<3:"Fuel Tank Capacity"@en>
我正在尝试查询索引以便将其恢复:
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("3", analyzer);
String queryString = "\"\"Fuel Tank Capacity"\@en\"";
Query query = parser.createPhraseQuery("3", QueryParser.escape(queryString));
TopDocs docs = searcher.search(query, null, 20);
我正在尝试搜索“燃料箱容量”这个术语(包括引号),所以我试图逃避它们,我在这些术语周围添加了几个引号,以便让lucene了解我正在搜索对于整篇文章。
如果我打印查询,我得到: 3:“油箱容量” 但我不想在@符号上拆分文字。
我认为我的第一个问题是StandardAnalyzer,因为它似乎是标记化的,如果我没有弄错的话。但是,我无法理解如何查询索引以获得“燃料箱容量”(包括引号)。
谢谢
答案 0 :(得分:7)
你可以简化问题,只需将QueryParser
完全排除在外。由于您使用的是StringField
,因此字段的整个内容都是单个字词,因此简单的TermQuery
应该可以正常运行:
Query query = new TermQuery(new Term("3","\"Fuel Tank Capacity\"@en"));
答案 1 :(得分:1)
当转义引号(或Lucene中的任何其他特殊符号)时,您需要使用\,但不要忘记需要在Java字符串中转义反斜杠。
以下为我效劳:
Query q = new QueryParser(
Version.LUCENE_4_10_0,
"",
new StandardAnalyzer(Version.LUCENE_4_10_0)
).parse("3:\"\\\"Fuel Tank Capacity\\\"@en\"");
我是怎么到达这个的?
"Fuel Tank Capacity"@en
"
转义每个\
):\"Fuel Tank Capacity\"@en
"\"Fuel Tank Capacity\"@en"
\"\\\"Fuel Tank Capacity\\\"@en\"