2014-09-12 78 views
3

我試圖創建一個Lucene 4.10索引。我只是想在索引中保存我放入文檔中的確切字符串,而不用標記。Lucene - 精確的字符串匹配

我正在使用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); 

我試着搜索術語「燃油箱容量」 @en(引號包含),所以我試圖逃跑,他們和我把另一對夫婦報價周圍的條款中爲了讓lucene受到關注我正在尋找整個文本。

如果我打印查詢,我得到: 3:「油箱容量EN」 但我不想拆就@符號的文本。

我認爲我的第一個問題是StandardAnalyzer,因爲它似乎標記了,如果我沒有弄錯的話。但是,我無法理解如何查詢索引以獲得完全「燃料箱容量」(包括引號)。

謝謝

+0

看到這個很能說明問題:http://stackoverflow.com/a/15416213/ 4017037 – stacky 2014-09-12 13:56:07

回答

6

您可以簡化事項,並將QueryParser完全排除在等式之外。由於您使用的是StringField,本場的全部內容是一個名詞,所以一個簡單的TermQuery應該很好地工作:

Query query = new TermQuery(new Term("3","\"Fuel Tank Capacity\"@en")); 
+0

這工作!謝謝 :) – LucaT 2014-09-12 21:12:35

0

當逃逸引號(或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字符串(每個斜線變成雙斜線,雙引號用反斜線轉義)需要添加轉義:\"\\\"Fuel Tank Capacity\\\"@en\"
+0

Thak你的答案,但也許我錯過了一些東西。我嘗試使用字符串轉義查詢我的索引,正如你所說的,但是當我嘗試打印Query q.toString()時,我得到的結果是: 3:「油箱容量en」 ,再一次,我沒有得到來自我的索引的任何文件... – LucaT 2014-09-12 20:36:32