5

カスタム アナライザーを使用して、コードのインデックス作成と検索を行っています。「will wi-fi work」というテキストが与えられると、次のトークンが生成されます (「will」はストップ ワードであるため、削除されます)。

wi-fi {position:2 start:5 end:10}
wifi {position:2 start:5 end:10}
wi {position:2 start:5 end:7}
fi {position:2 start:8 end:10}
work {position:3 start:11 end:15}

wi-fi, work という用語を検索すると、検索結果が表示されます。ただし、wifi、wi、fi のクエリ (フレーズ/非フレーズ) を発行すると、結果が得られません。生成されたトークンに問題はありますか?

解析された検索クエリ:

Wi-Fiの場合 (正常に動作します)

Lucene's: +matchAllDocs:true +(alltext:wi-fi alltext:wifi alltext:wi alltext:fi)

Wi-Fi の場合(結果は返されません)

Lucene's: +matchAllDocs:true +alltext:wifi

「wi-fi は動作しますか」の場合 (正常に動作します)

Lucene's: +matchAllDocs:true +alltext:"(wi-fi wifi wi fi) work"

「Wi-Fi は機能しますか」の場合(結果は返されません)

Lucene's: +matchAllDocs:true +alltext:"? wifi work"

アップデート

問題が見つかりました:

public boolean incrementToken() throws IOException
{
    /*
     * first return all tokens in the list
     */
    if (tokens.size() > 0)
    {
        Token top = tokens.removeFirst();
        restoreState(current);
        **termAtt.setEmpty().append(new String(top.buffer(), 0, top.length()));**
        offsetAtt.setOffset(top.startOffset(), top.endOffset());
        posIncrAtt.setPositionIncrement(0);
        return true;
    }

    /*
     * if there are no more incoming tokens return false
     */
    if (!input.incrementToken())
        return false;

    Token wrapper = new Token();
    wrapper.copyBuffer(termAtt.buffer(), 0, termAtt.length());
    wrapper.setStartOffset(offsetAtt.startOffset());
    wrapper.setEndOffset(offsetAtt.endOffset());
    wrapper.setPositionIncrement(posIncrAtt.getPositionIncrement());

    normalizeHyphens(wrapper);
    current = captureState();
    return true;
}

上記の太字の行で私は言っていました

termAtt.setEmpty().append(new String(top.buffer()));

wiを検索すると、結果が得られませんでしたが、以前はwi*で結果が得られていました。この top.buffer() には、奇妙な動作を引き起こす追加のジャンクが含まれているようです。

これで一日を無駄にしました:(

4

1 に答える 1

1

アナライザーやパーサーを知らなくても推測するだけです。

  • 検索で使用しているwi、fiという単語がストップワードの一部ではないことを確認してください。おそらくストップリストファイルはあなたがチェックする場所です
  • ファセット検索/加重検索。これらを台無しにしていないことを確認してください。
  • 解析/分析した後、検索しているトークン化された用語を取得していることを確認してください。
  • 用語がインデックスにプッシュされていることを確認してください。
于 2012-04-10T07:46:56.920 に答える