如何使用Hibernate Analyzer?

时间:2013-08-14 16:41:00

标签: hibernate lucene escaping character hibernate-search

我正在尝试在我的hibernate查询中搜索特殊字符,我使用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();

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为使用QueryParser.escape没有任何意义。这旨在转义字符串形式的查询以准备解析。您没有使用QueryParser,并在评论中说明了您不打算这样做。你提到你已经尝试过关键字分析器了。我怀疑问题是你 通过QueryParser.escape方法运行它,并且在这个上下文中添加了一个无关的反斜杠,阻止了匹配。


如果您倾向于使用QueryParser并利用分析,您可能会创建如下内容:

SearchFactory searchFactory = fullTextSession.getSearchFactory();
org.apache.lucene.queryParser.QueryParser parser = new QueryParser(defaultField, searchFactory.getAnalyzer(JobReq.class) );
/* 
 create your BooleanQuery, loop, whatever else
*/
    org.apache.lucene.search.Query query = parser.parse( allFields[i].getName().toString() + ":" + QueryParser.escape(termToFind) + "*" );
    bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));

hibQuery = fullTextSession.createFullTextQuery(bq).setSort(sort);
results = hibQuery.list();