スペース区切りで絞込みのできる全文検索を実装する



※html内にスクリプトを記述するため改行が無駄に入っています。
どこの改行がしてはいけないのか理解できない方は
残念ながらこのページに記述したものは
利用できないと思いますので諦めてください。

あるテーブル内の記事全文を検索するのは簡単に出来ますが、
検索エンジンにあるようなスペース区切りで
絞込み検索をするにはどうすればいいでしょうか?
それが以下の方法です。

Dim query As String
Dim split() As String

[query]は検索ページへQueryStringで送られてきます。
これはformでも受けられます。
[split()]は検索単語をスペースごとに分解します。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
QueryBox.Text = Request.Form("query")
If QueryBox.Text =String.Empty Then
QueryBox.Text = Request.QueryString("query")
End if
chikan()
End If
End Sub

↑QueryBox.Textはページ内の検索語を打ち込む
テキストボックスとして設置していますが、
他のページから送られてくる検索も受け付けるため、
一旦ページロード時に検索語をQueryBox.Textへ収納します。

↓検索語を分解するサブです。
Protected Sub chikan()
Dim kakikae1 As String
kakikae1 = QueryBox.Text.Replace( "<" , "&lt;").Replace( ">" , "&gt;")
↑ここでは<と>を置き換えています。
これをしないといろいろやばいです。

If Not kakikae1 = "" then
kakikae1 = kakikae1.Replace(" "," ")
↑ここはスペースを全角で打つ人と半角で打つ人がいるので
スペースを半角に置き換えています。

split = kakikae1.Split(" ", ",", ".", ":")
↑ここでスペースとカンマ、ピリオド、セミコロンでも
単語を分解できるようにしています。

ViewState("split") = split
↑ここでビューステートに分解した単語を収納します。

ItemSearch()
↑検索語がある場合のみ実際の検索を実行します。

Else
QueryBox.Text= "検索単語を入力してください"
↑検索語がない場合はメッセージのみで検索は実行しません。
End if
End Sub

↓検索語をサーチするサブです。
Protected Sub ItemSearch()

split=ViewState("split")
Dim StrSQL As String
StrSQL = "Select [抽出するデータ] from [Dataの入っているテーブル] where [検索フィールド] Like('%" & split(0) & "%')"

if UBound(split) >0 Then
For i As integer = 0 to UBound(split)
StrSQL = StrSQL & " and [検索フィールド] Like('%" & split(i) & "%')"
Next
End if
StrSQL = StrSQL & "ORDER BY ID desc"

Dim conec As New OleDbConnection(ConfigurationSettings.AppSettings("[web.config内のadd key=の名前]"))
↑アクセスのデータベースをweb.configで場所とプロバイダー名で指定してあります。

Dim comd As New OleDbDataAdapter(StrSQL, conec)
Dim WebDataSet As New Dataset()
comd.Fill(WebDataSet)
conec.Close()
If WebDataSet.Tables(0).Rows.Count = 0 Then
Chek_Label.Text = "該当ありませんでした"
↑検索結果をページ内に設置したラベルに表示します。

Exit sub
Else
With GridView0
.DataSource = WebDataSet
.DataBind()
End With
Chek_Literal.Text=WebDataSet.Tables(0).Rows.Count & "件該当しました。"
↑検索結果をページ内に設置したラベルに表示します。
End If

End Sub

以上の部分だけですと、ページロード時に他のページから
検索語が送信されてきた時だけ検索し、
検索ボタンを押した時には検索が実行されないことになるので、
検索ボタンを押した時に実行するサブを作ります。

Protected Sub QueryButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
chikan()
End Sub

最後に検索実行時に検索ボタンを押さず
Enterキーで代用する人がほとんどですので、
検索語を打ち込むボックス[QueryBox]に以下の
コマンドを設定しておきます。

OnTextChanged="QueryButtonClick"

以上で外部から検索語が送信されても
検索ボタンをクリックしても
Enterキーを押しても検索が実行される様になりました。

対応バージョン:2.0

記事id:62 / 5872PV

関連記事