0

Google と同様の検索を構築しようとしています (二重引用符で囲まれた完全一致に関して)。

例として次のフレーズを使用してみましょう

「語句検索」単語[別語句]

現在、次のコードを使用する場合

        Dim searchTermsArray As String() = searchTerms.Split(New String() {" ", ",", ";"}, StringSplitOptions.RemoveEmptyEntries)

        For Each entry In searchTermsArray
            Response.Write(entry & "<br>")
        Next

私の出力は

「語句
検索」単語
[ 別
語句 ]

しかし、私が本当に必要としているのは、キーと値のペアを構築することです

phrase search     |  table1  
single            |  table1  
terms             |  table1  
different phrase  |  table2

ここで、table1 は一般的な情報を含むテーブルで、table2 は stackoverflow のテーブルと同様の「タグ」のテーブルです。

入力を適切にキャプチャする方法について、誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

3

あなたがやろうとしていることはそれほど些細なことではありません。「Google に似た」検索を実装することは、検索文字列を解析することをはるかに超えています。

車輪を再発明するのではなく、代わりにApache Lucene.NETApache Solrなどの本番対応のソリューションを使用することをお勧めします。これらは、解析と全文検索の両方に対応しています。

しかし、この種の文字列のみを解析する必要がある場合は、Pete が指摘したソリューションを実際に検討する必要があります。

于 2010-08-21T18:30:45.160 に答える
0

正規表現はあなたの友達です。この質問を参照してください

于 2010-08-21T18:26:54.613 に答える
0

取得する計画に応じて、Irony に含まれている検索文法/実装を検討することもできます。

http://irony.codeplex.com/

于 2010-08-21T18:36:26.950 に答える
0

検索文字列の解析は、通常とは異なる問題です。つまり、正規表現は一見近いものになる可能性がありますが、独自の拡張機能を使用せずにそこまでたどり着くことはできず、維持できない混乱した式を構築し、希望どおりに機能しない厄介なエッジケースを開いたままにします. 、または 3 つの組み合わせ。

代わりに、これを処理する 3 つの正しい方法があります。

  1. Lucene などのサードパーティ ソリューションを使用します。
  2. antlr のようなものを介して文法を構築します。
  3. 独自のステート マシンを構築します。

このレベルの問題 (そして、検索が自分で実装したいと思うほどコアであると仮定する) の場合、私はおそらくオプション 3 を使用します。ステート マシンのセットアップ方法の説明。あなたがしているのは、それをコードに組み込むことだけです。これにより、より大きなレクサー コンポーネントをコードに追加することなく、パフォーマンスと機能を調整できるようになります。

これをどのように行うかの例については、この質問に対する私の回答をご覧ください
。C#
ハットで CSV ファイルを読み取るには、文字列を文字単位で解析するステート マシンを構築します。これは、完全に正しいソリューションを実装するための最も簡単な方法であり、コードも最速になります。

于 2010-08-21T18:43:39.103 に答える