O
Hallo.
Ich habe mir für einen Webservice 2 Suchfunktionen gebaut, die einen Katalog des Microsoft Index Servers durchsuchen. Sie tun im Prinzip beide das gleiche, haben jedoch jeweils Vor- und Nachteile.
Erste Variante
private int GiveDocumentList(string sProperty, string sSearchString, ref DataView dvDocView)
{
// Die Select Abfrage. Enthaelt was aufgelistet werden soll, und in welcher EIgenschaft
// nach der Zeichenkette gesucht werden soll
string sQuery = "Select DocCategory,DocTitle,Path,DocKeywords,DocComments,Size,Filename from Scope() where FREETEXT(" + sProperty + ", '" + sSearchString + "')";
// Verbindungszeichenkette für das OleDbConnection Objekt
// Verbindet sich mit dem Indexdienst
string sConnection = "Provider=MSIDXS.1;Integrated Security .='';Data Source=" + sIndexCatalog;
System.Data.OleDb.OleDbConnection odcConnection = new System.Data.OleDb.OleDbConnection(sConnection);
// versuchen sich mit dem Indexdienst zu verbinden
try
{
odcConnection.Open();
}
catch (Exception e)
{
throw (e);
}
System.Data.OleDb.OleDbDataAdapter oddCommand = new System.Data.OleDb.OleDbDataAdapter(sQuery, odcConnection);
System.Data.DataSet dsDataSet = new System.Data.DataSet();
// versuche das Suchresultat auszulesen
try
{
oddCommand.Fill(dsDataSet, "SearchResults");
// wenn die Suche keine Ergebisse ergab
if (dsDataSet.Tables[0].Rows.Count == 0)
return 1;
}
catch (Exception e)
{
throw (e);
}
dvDocView.Table = dsDataSet.Tables[0];
return 0;
}
Zweite Variante
private void PerformQuery(string sProperty, string sSearchString, ref DataSet dsDocView)
{
Cisso.CissoQueryClass cqcClass = new Cisso.CissoQueryClass();
cqcClass.Catalog = sIndexCatalog;
cqcClass.MaxRecords = iMaxResults;
//cqc.CiScope = CiScope;
//cqcClass.CiFlags = "DEEP";
cqcClass.Query = sProperty + " " + sSearchString;
cqcClass.Columns = "DocCategory,DocTitle,Path,DocKeywords,DocComments,Size,Filename";
cqcClass.SortBy = "DocKeywords[a]";
cqcClass.AllowEnumeration = false;
try
{
ADODB.Recordset rsIX = (ADODB.Recordset)cqcClass.CreateRecordset("nonsequential");
System.Data.OleDb.OleDbDataAdapter daConvertToDataset = new System.Data.OleDb.OleDbDataAdapter();
daConvertToDataset.Fill(dsDocView, rsIX, "IXResults");
}
catch (Exception eExc)
{
throw (eExc);
}
return;
}
Mein Problem bei der ersten Variante ist, dass man keine Suchanfragen kleiner 2 Zeichen stellen kann. Da ich aber unter anderem Suchanfragen Alphabetisch von A bis Z machen will, brauchte ich noch die Zweite Variante. Theoretisch würde natürlich nur die Zweite reichen. Nun habe ich aber bei der zweiten Variante das Problem, dass die Suchanfrage nicht case Sensitive ist. Wenn ich also zum Beispiel unter den Stichwörtern eines Dokumentes nach "A" suchen will, zeigt er mir auch alle Dokumente die eine kleines a mitten im Wort enthalten.
Wie kann ich denn das Problem lösen? Muss ich die entsprechende Spalte in meinem DataSet nun extra nochmal durchsuchen auf groß A? Dann würde ich mir ja uqasi erst die grob gefilterten Dokumente holen und diese nocheinmal fein filtern. Erscheint mir nicht als so tolle Lösung. Oder gibt es da eine bessere Technik um den Index Server abzufragen?
Gibt es eigentlich Unterschiede in der Suchleistung der beiden Varianten?
Vielen Dank schonmal.