0

Hibernate Search を使用しています。問題は、検索を実行すると、次の文字列になることです。

「私」

結果が出ない…これでやってみると…

"l*"

結果は次のとおりです。

「Lampada bla bla」「Lampione bla bla bla」「Lost」

これが私のポジョです

@Id @GeneratedValue
@DocumentId
private Long id;

@Field(index=Index.TOKENIZED, store=Store.YES )
private String nome;

@Field(index=Index.TOKENIZED,store=Store.YES, termVector=TermVector.YES)
private String descrizione;

@Column(length=30)
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}

@Column(length=100)
public String getDescrizione() {
    return descrizione;
}
public void setDescrizione(String descrizione) {
    this.descrizione = descrizione;
}
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}

@Override
public String toString() {
    return String.format("(%s) %s: %s", id, nome, descrizione);
}

これは私のJavaクラスです:

Session session = super.session();
    List result = new ArrayList();
    luceneSession = Search.getFullTextSession(session);

    String[] fields = (String[]) boostsNField.keySet().toArray(new String[boostsNField.keySet().size()]);

    QueryParser parser =  new MultiFieldQueryParser(Version.LUCENE_30, fields, new StandardAnalyzer(Version.LUCENE_30), boostsNField);
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);


    try {
        Query luceneQuery = parser.parse(queryString);
        org.hibernate.Query fullTextQuery = luceneSession.createFullTextQuery( luceneQuery ); // E' possibile scegliere impostare il class da ricercare
        result = fullTextQuery.list();

    } catch (ParseException e) {

問題はどこだ??!?!?

4

1 に答える 1

1

ドキュメントのインデックス作成に StandardAnalyzer を使用している可能性があります。javadoc が言うように、それはStandarkTokenizerを使用します。このトークナイザーは、テキストから単語を抽出し、いくつかの単純なルールで処理します (javadoc を参照)。その後、トークンのフィルタリングが行われますが、通常は単語がトークンになります。

詳細はわかりませんが、検索時にluceneはトークン(あなたの場合は単語)を比較/検索するので、「l」トークンは「Lampada」と同じではないため、「l」でクエリすると空のリストになると思いますトークン。

インデックス付きドキュメントの部分文字列を使用してインデックスを検索する場合は、ngrams () に基づくトークナイザーの使用/作成を検討する必要があります。指定された文字列の可能なすべての部分文字列に対して、トークンを生成します。「Lampada」を文字列として持つと、「L」、「La」、「Lam」、...、「ada」、「da」、「a」が生成され、さらに StandardTokenizer と query="l " 一致するドキュメントが見つかります (このアプローチにより、インデックスの成長速度が向上することに注意してください)。

于 2011-01-13T19:52:59.837 に答える