我正在使用Hibernate Search。问题是,当我执行搜索时这个字符串:
“l”
我没有结果...... 如果我尝试这个......
“L *”
结果是:
“Lampada bla bla” “Lampione bla bla bla” “迷失”
这是我的pojo
@Id @GeneratedValue
@DocumentId
private Long id;
@Field(index=Index.TOKENIZED, store=Store.YES )
private String nome;
@Field(index=Index.TOKENIZED,store=Store.YES, termVector=TermVector.YES)
private String descrizione;
@Column(length=30)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(length=100)
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return String.format("(%s) %s: %s", id, nome, descrizione);
}
这是我的java类:
Session session = super.session();
List result = new ArrayList();
luceneSession = Search.getFullTextSession(session);
String[] fields = (String[]) boostsNField.keySet().toArray(new String[boostsNField.keySet().size()]);
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fields, new StandardAnalyzer(Version.LUCENE_30), boostsNField);
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
try {
Query luceneQuery = parser.parse(queryString);
org.hibernate.Query fullTextQuery = luceneSession.createFullTextQuery( luceneQuery ); // E' possibile scegliere impostare il class da ricercare
result = fullTextQuery.list();
} catch (ParseException e) {
问题出在哪里??!?!?
答案 0 :(得分:1)
您可能正在使用StandardAnalyzer来索引文档。正如javadoc所说,它使用StandarkTokenizer。此标记器从文本中提取单词并使用一些简单的规则处理它们(读取javadoc)。然后对令牌进行一些过滤,但一般来说,单词会成为令牌。
我不知道细节,但我认为在搜索时,lucene比较/搜索令牌(在你的情况下是单词),因此用“l”结果查询空列表,因为“l”令牌不同于“Lampada”令牌。
如果要使用索引文档的任何子字符串搜索索引,应考虑使用/编写基于ngrams()的标记生成器。对于给定字符串的每个可能的子字符串,它产生令牌。将“Lampada”作为字符串,它将生成“L”,“La”,“Lam”,...,“ada”,“da”,“a”,然后即使在使用StandardTokenizer和查询=“l来使用LuceneIndex时也是如此“你会找到匹配的文件(要注意这种方法,可以提高索引增长的速度)。