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。これは、解析の準備として文字列形式のクエリをエスケープするように設計されています。を使用して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 に答える