2009-12-04 22 views
9

私は約4,000の場所を含む比較的小さなインデックスを持っています。とりわけ、私はそれを使って検索フォームにオートコンプリートフィールドを設定しています。Lucene.NETで部分単語検索を行う方法は?

私の指数は、私はなりたい

  • デイトン、オハイオ州
  • ダブリン、オハイオ州
  • コロンバス、オハイオ州
  • オハイオ

    • のような値を含むLocationフィールドでドキュメントを含みます"ohi"と入力してこれらの結果を表示させることができますが、今すぐ完全な単語 "ohio"を入力するまでは何も表示されません。私はLucene.NET v2.3.2.1を使用していて、私のクエリを設定するために、次のように私のコードの関連部分がある

      ....

      要するに
      BooleanQuery keywords = new BooleanQuery(); 
      QueryParser parser = new QueryParser("location", new StandardAnalyzer()); 
      parser.SetAllowLeadingWildcard(true); 
      keywords.Add(parser.Parse("\"*" + location + "*\""), BooleanClause.Occur.SHOULD); 
      luceneQuery.Add(keywords, BooleanClause.Occur.MUST); 
      

      、私はしたいのですが

      SELECT * from Location where Name LIKE '%ohi%' 
      

      Luceneでこれを行うことはできますか?

    答えて

    14

    は、この文字列で検索してください:応答のための

    parser.Parse(query.Keywords.ToLower() + "*") 
    
    +0

    それはトリックでした!あなたは私が必要とするものを持っていました。 /GBT:werd !!! – JamieGaines

    +3

    この回答は、最終コードの外観を反映していません。私はこれをどこに置くべきか迷っていますか?どのようなタイプの "クエリ"ですか?最終的なサンプルは素晴らしいでしょう。 – irperez

    +0

    少なくともJavaでは、 "Test *"というクエリはコンパイルされないので、 "Test *"というクエリはコンパイルされないので、空白を削除する必要があります。 – bcoughlan

    0

    最初は部分的な単語でインデックスを作成することが重要です。アナライザーは、分析する際に部分的なキーワードをインデックスに入れる必要があります。

    ルーゼンインデックスルックアップツリーは、左から右へ機能します。キーワードの途中で検索したい場合は、分析する際に分割する必要があります。問題は、部分的なキーワードが通常あなたのインデックスサイズを爆発させるということです。

    人は、通常、ルート単語(接頭辞と接尾辞を除く)で単語を分割する、本当に創造的なアナライザを使用します。

    ルケンを理解するために深く掘り下げてください。それは良いものです。 :-)

    1

    はい、これは可能です。ただし、ワイルドカードを使用すると、クエリが遅くなる可能性があります。 documentationを確認してください。また、文字列全体(たとえば、 "Dayton、Ohio")を単一のトークンとして索引付けする場合、ほとんどの問合せは先頭の接頭辞問合せに縮退します。 StandardAnalyzerのようなトークナイザを使用することで、ワイルドカードを先導する要件が緩和されます。

    パフォーマンス上の理由から先頭のプレフィックスを必要としない場合は、ngramのインデックスを試すことができます。そうすれば、ワイルドカード照会に先行することはありません。 ngram(長さ4の場合のみ)トークナイザは、 "dayt"、 "ayto"、 "yton"などのように "Dayton Ohio"のトークンを作成します。

    +0

    感謝を。私はあまりにも遅いかどうかを判断する前に、私はそれが最初に動作することを確認したいので、私はあまりにも遅いクエリを心配していない。私のロケーションリストは約4000のドキュメントで安定しているはずですので、それ以上に大きくなることを心配していません。 「はい、これができます」と言うともう少し詳しく説明できますか?上記のコードは、私が期待していることを実行しているはずだと思いましたが、そうではありません。私が間違っていることに関するアイデアは? – JamieGaines

    関連する問題