1

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

1 回答 1

1

在这种情况下,我认为使用QueryParser.escape. 这旨在转义字符串形式的查询以准备解析。您没有使用 a 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();
于 2013-08-14T18:33:20.450 回答