休止状態のクエリで特殊文字を検索しようとしています。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();