我正在尝试在我的休眠查询中搜索特殊字符,我使用 QueryParser.escape(String searchTerm) 在所有特殊字符前面放置一个 '\' 字符以正确转义它们。
但是我发现用于标记化的标准分析器会从索引中删除这些特殊字符,因此即使您正确地转义了术语“abc-def”,如果您尝试搜索它,您也必须搜索“abc def”。
那么我应该使用什么分析器/我应该如何指定分析器在索引时不删除特殊字符?
下面是我的注释类和查询构建的片段:
@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {
@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field
@Column(name="jobId", nullable=false, unique=true)
private String jobId;
@Fields({@Field, @Field(name = "jobIdSort", analyze = Analyze.NO)})
@Column(name="jobIdSort", nullable=false, unique=true)
private String jobIdSort;
@Field
@Column(name="jobTitle", nullable=false)
private String jobTitle;
询问:
tempQ = (org.apache.lucene.search.Query) qb.keyword()
.wildcard()
.onField(allFields[i].getName().toString())
.matching(QueryParser.escape(termToFind) + "*")
.createQuery();
}
bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));
}
}
}
//wrap Lucene query in an org.hibernate.Query
hibQuery = fullTextSession.createFullTextQuery(bq, this.type).setSort(sort);
results = hibQuery.list();
System.out.println(bq);
fullTextSession.getTransaction().commit();