Lucene - 精确的字符串匹配

时间:2014-09-12 13:40:41

标签: java lucene tokenize

我正在尝试创建一个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,因为它似乎是标记化的,如果我没有弄错的话。但是,我无法理解如何查询索引以获得“燃料箱容量”(包括引号)。

谢谢

2 个答案:

答案 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\"");

我是怎么到达这个的?

  1. 取得原始字符串"Fuel Tank Capacity"@en
  2. 添加了Lucene所必需的转义(使用"转义每个\):\"Fuel Tank Capacity\"@en
  3. 在字符串的开头和结尾添加了转义引号:"\"Fuel Tank Capacity\"@en"
  4. 添加了Java String所必需的转义(每个斜杠变成双斜杠,双引号用反斜杠转义):\"\\\"Fuel Tank Capacity\\\"@en\"