4

Zend Lucene を使用して PHP Web サイトの検索機能を構築していますが、問題が発生しています。私の Web サイトはショップ ディレクター (そのようなもの) です。

たとえば、「FooBar」という名前のショップがありますが、訪問者が「Foo Bar」を検索しても結果がありません。また、お店の名前が「Foo Bar」で、訪問者が「FooBar」と検索しても何も見つかりません。

「foobar~」(あいまい検索)で検索してみましたが、「Foo Bar」という記事は見つかりませんでした。

インデックスを作成したり、クエリを作成したりする特別な方法はありますか?

4

4 に答える 4

2

オプション 1: 入力クエリ文字列をさまざまなポイントで 2 つの部分に分割して検索します。例えば。この場合、クエリは (+fo +bar) OR (+foo +bar) OR (+foob +ar) になります。問題は、このトークン化が入力クエリ文字列に 2 つのトークンがあると想定していることです。また、(+foob +ar) の結果など、余分な、おそらく無関係な結果が得られる場合があります。

オプション 2: インデックス作成とクエリ中に n-gram トークン化を使用します。「foo bar」のトークンをインデックス化すると、fo、oo、ba、ar になります。foob​​ar で検索すると、トークンは fo、oo、ob、ba、ar になります。演算子として OR を使用して検索すると、上部に最大の n-gram 一致を持つドキュメントが表示されます。これはNGramTokenizerで実現できます

于 2009-04-29T10:02:52.613 に答える
1

最も一般的な名前の混乱のために、インデックスエントリを手動で追加します。顧客に特別なフォームに入力してもらいます。

于 2009-05-07T14:25:19.890 に答える
0

パフォーマンスを気にしない場合は、WildcardQuery を使用します (パフォーマンスは大幅に低下します)。

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

0 文字以上の場合は「*」を使用し、0 文字または 1 文字の場合は「?」を使用します。

パフォーマンスが重要な場合は、BooleanQuery を使用してみてください。

于 2009-05-01T00:40:48.157 に答える
0

「*foo* AND *bar*」または「*foo* OR *bar*」を試しましたか? それは Ferret で動作し、Lucene に基づいていると読みました。

于 2009-04-29T07:23:43.510 に答える