1

スクリプトでは、広告タイトルを lucene インデックスと比較する必要があります。
このインデックスには、いくつかのキーワードと、広告が一致した場合に実行するアクションが含まれています。

例えば:

(keyword,action,new_category,optional)
"red volvo","recategorize","cars","red"

アイデアは、キーワード フィールドに対して広告タイトル全体をクエリする必要があるということです。両方(クエリとインデックス)は、ステミング、小文字化などを備えた独自のアナライザーで分析されます。

私が抱えている問題は、部分一致です。例:
「私は赤い馬を販売しています」は「赤いボルボ」に一致します。

逆の場合 (広告がインデックスに登録されていて、キーワードでクエリを実行する必要がある場合)、次のことができます。

q=+red +volvo

しかし、大量の広告を処理する必要があるため、これはオプションではありません。

具体的な質問ですが、フィールド内のすべてのトークンを強制的にクエリと一致させる方法はありますか?
KeywordAnalyzer を使用して「red volvo」全体を 1 つのトークンと見なすことはできますが、広告タイトル全体を単一のキーワードとして分析することはできません。これは何にも一致しないためです。

4

2 に答える 2

0

「red volvo」というフレーズを正確にキャッチしたいが、「red」や「volvo」だけをキャッチしたくない場合は、キーワード アナライザーを使用してインデックスを作成することで正しい方向に進んでいると思います。しかし、検索するフィールドよりも長いクエリを使用して検索したい場合、これは典型的な使用例の逆です。

推奨するのはためらわれますが、このクエリを実行する正しい方法は、インデックスの作成に使用するものとは異なるアナライザーを使用してクエリを実行することだと思います。

インデックス化されたフレーズが予測可能なサイズ (たとえば 2 ~ 5 語) である場合、ShingleFilterを使用すると、キーワードとして検索するために長いクエリから必要な用語を生成できます。

このようなもの:

Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36);
analyzer = new ShingleAnalyzerWrapper(analyzer, 1, 5); //wrapper that adds a ShingleFilter to the analyzer
QueryParser parser = new StandardQueryParser(analyzer);  
Query query = parser.parse(query, defaultField);
searcher.search(query, 10);

これは空白のみで分割され、1 ~ 5 トークンの長さの検索語が生成されるため、例では、「私は赤い馬を販売しています」は「私」、「私は」、「私は」などの語を生成します。 」、「赤い馬」、「売っています」、「赤い馬を売っています」など。

キーワードでこれを機能させるには、空白フィルターがおそらく最良の選択だと思いますが、空白文字に遭遇すると、空白以外で分割されたり、複数の空白が連続したりすると、問題が発生する可能性があります。

于 2012-12-04T16:54:02.710 に答える
-1

Sounds like you could use Lucene's MemoryIndex: "this class targets fulltext search of huge numbers of queries over comparatively small transient realtime data (prospective search)"

于 2012-12-03T23:27:33.650 に答える