私はlucene検索を休止するのが初めてです。ワードの数日後から、私は特殊文字を使った検索キーワードに取り組んでいます。正確なフレーズ一致とブール検索のためにMultiFieldQueryParserを使用しています。しかし、このプロセスでは、「1年以上の経験がある」などの検索キーワードで結果を得ることができず、検索キーワードを引用符で囲まないと結果が得られます。だから私はluceneクエリの実行で観察されたものは、特別なシンボル(+)をエスケープしています。私はStandardAnalyzer.classを使用しています。 WhiteSpaceAnalyzerを使用している場合、特殊文字はエスケープされませんが、通常のテキストとして扱われる可能性があるため、+ java + php(つまりjavaおよびphp)のようなブール検索に影響する可能性があります。だから、いくつかの提案を助けてください。休止状態の検索で特殊文字を検索する方法は?
次は私の抜粋です。このような効果を制御する
Session session = getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "student.skills.skill",
"studentProfileSummary.profileTitle", "studentProfileSummary.currentDesignation" },
new StandardAnalyzer());
parser.setDefaultOperator(Operator.OR);
org.apache.lucene.search.Query luceneQuery = null;
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Student.class).get();
BooleanQuery boolQuery = new BooleanQuery();
if (StringUtils.isEmpty(zipcode) != true && StringUtils.isBlank(zipcode) != true) {
boolQuery.add(
qb.keyword().onField("personal.locations.postalCode").matching(zipcode).createQuery(),
BooleanClause.Occur.MUST);
}
if (StringUtils.isEmpty(query) != true && StringUtils.isBlank(query) != true) {
try {
luceneQuery = parser.parse(query.toUpperCase());
} catch (ParseException e) {
luceneQuery = parser.parse(parser.escape(query.toUpperCase()));
}
boolQuery.add(luceneQuery, BooleanClause.Occur.MUST);
}
boolQuery.add(qb.keyword().onField("vStatus").matching(1).createQuery(), BooleanClause.Occur.MUST);
boolQuery.add(qb.keyword().onField("status").matching(1).createQuery(), BooleanClause.Occur.MUST);
boolQuery.add(qb.range().onField("studentProfileSummary.profilePercentage").from(80).to(100).createQuery(),
BooleanClause.Occur.MUST);
FullTextQuery createFullTextQuery = fullTextSession.createFullTextQuery(boolQuery, Student.class);
createFullTextQuery.setProjection("id", "studentProfileSummary.profileTitle", "firstName","lastName");
if (isEmptyFilter == false) {
createFullTextQuery.setFirstResult((int) pageNumber);
createFullTextQuery.setMaxResults((int) end);
}
return createFullTextQuery.list();
@ Sanne.Tqあなたの返信のために私のデータベースに私はプロファイルタイトルと呼ばれるフィールドを持っています。今私は今まで私の検索キーワードmatches.Itと結果を取得したい文字列 "6年"それは" 1年以上の経験がある "というマッチストリングを得なければなりません。 – Satya