在Lucene索引中搜索特定术语

时间:2013-04-18 19:30:24

标签: java database lucene

我正在尝试使用一些特定的单词对Lucene索引进行搜索,我知道这些单词已编入索引,但结果不是很好。

如何对特定字词(“129202”)执行查询?我已经尝试在字符串的开头添加加号,但它不起作用。

我的查询:

QueryParser q = new QueryParser(Version.LUCENE_42, "tags", new SimpleAnalyzer(Version.LUCENE_42));
Query query = q.parse("sapatilha feminina ramarim 129202 cinza");

下面是我想要的索引文档(xml)

<?xml version="1.0" encoding="UTF-8"?>
<product>
 <tags>
   <tag>Sapatilha Pedras Preto</tag>
   <tag>ramarin</tag>
   <tag>ramarin 129202</tag>
   <tag>preto</tag>
 </tags>
 <id>71</id>
 <url>http://www.dafiti.com.br/Sapatilha-Pedras-Preto-1135428.html</url>
</product>

1 个答案:

答案 0 :(得分:1)

SimpleAnalyzer,您用来查询的分析器(我假设要编制索引)使用LetterTokenizer,根据文档:

  

...将标记定义为相邻字母的最大字​​符串,由java.lang.Character.isLetter()

定义

也就是说,不是数字。此分析仪将完全丢失数字。我建议您查看另一个,例如StandardAnalyzerWhitespaceAnalyzer


演示:

StringReader reader = new StringReader("ramarim 129202 cinza");
LetterTokenizer stream = new LetterTokenizer(Version.LUCENE_42, reader);        
stream.setReader(reader);
stream.reset();
while(stream.incrementToken()) {
    System.out.println(stream.reflectAsString(false));
}
stream.close();

输出:

term=ramarim,bytes=[72 61 6d 61 72 69 6d],startOffset=19,endOffset=26
term=cinza,bytes=[63 69 6e 7a 61],startOffset=34,endOffset=39

代入StandardTokenizer(由StandardAnalyzer使用)将为您提供:

term=ramarim,bytes=[72 61 6d 61 72 69 6d],startOffset=19,endOffset=26,positionIncrement=1,type=<ALPHANUM>
term=129202,bytes=[31 32 39 32 30 32],startOffset=27,endOffset=33,positionIncrement=1,type=<NUM>
term=cinza,bytes=[63 69 6e 7a 61],startOffset=34,endOffset=39,positionIncrement=1,type=<ALPHANUM>