2017-03-23 15 views
1

。 3つの単語すべてが単一のレコードに表示されないので、結果は返されません。しかし、「ブラウン・キツネ」と「クイック・キツネ」のように、「クイックブラウン」は結果を返します。FullTextSearchオプションの言葉

単語がまたはすべての単語せずに結果を返すために、クエリ自体のために(ユーザが「速い茶色のキツネ*」キツネがオプションであることを示すために言うIE)のオプションであるので、入力されたクエリを構築する方法はありますか? 2つのクエリを実行しても問題ありません。すべての単語に対して最初のクエリを実行し、最初に行が返されなかった場合は、不完全な入力に対して再度クエリを実行します。

string query = String.Concat(@" 
    SELECT * 
    FROM FullTextSearches AS FT_TBL INNER JOIN 
    CONTAINSTABLE(FullTextSearches, (Title, Body), @SearchCondition) AS KEY_TBL 
    ON FT_TBL.Id = KEY_TBL.[KEY] 
    WHERE (FT_TBL.Accessibility = 0) OR ((FT_TBL.Accessibility & @Roles) > 0) 
    ORDER BY KEY_TBL.[RANK] DESC 
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY"); 

SqlParameter paramSearch = new SqlParameter("SearchCondition", "\"" + searchTerm + "\""); 
SqlParameter paramSkip = new SqlParameter("Skip", pageNumber * pageSize); 
SqlParameter paramTake = new SqlParameter("Take", pageSize); 
SqlParameter paramRoles = new SqlParameter("Roles", accessibility); 
object[] parameters = new object[] { paramSearch, paramSkip, paramTake, paramRoles }; 
var results = db.FullTextSearch.SqlQuery(query, parameters); 

常に学習します。

+0

いつも、3番目の単語を除外するケースはありますか? – ngeksyo

+0

これはどんな単語でもかまいません。理想的には、単語の一部だけを含むレコードよりも上位のすべての単語を含むレコードを返すのが理想的です。たとえば、Googleでは、すべての単語が見つからない場合、検索結果に「missing:[word]」と表示されます。私はそれを持っているわけではありません。ただWIBNIです。 – GeoffM

答えて

1

私はこのような何かがそこにあなたを得るべきだと思います。複数のクエリではなく複数の結合。

string searchTerm = "quick brown *fox" 
string withOptional = searchTerm.Replace("*", ""); 
string withoutOptional = Regex.Replace(searchTerm, "[*]\w", ""); 

string[] options = new string[]{ withOptional, withoutOptional }; 

string query = String.Concat(@" 
    SELECT * 
    FROM FullTextSearches AS FT_TBL "); 

int i = 1; 
List<SqlParameter> parameters = new List<SqlParameter>(); 

foreach(string option in options) 
{ 
    parameters.Add(new SqlParameter("SearchCondition" + (i++).ToString(), "\"" + option + "\"")) 
    query += [email protected]"LEFT JOIN CONTAINSTABLE(FullTextSearches, (Title, Body), @SearchCondition{i - 1}) AS KEY_TBL{i - 1} ON FT_TBL.Id = KEY_TBL{i - 1}.[KEY] "; 
} 

SqlParameter paramSkip = new SqlParameter("Skip", pageNumber * pageSize); 
SqlParameter paramTake = new SqlParameter("Take", pageSize); 
SqlParameter paramRoles = new SqlParameter("Roles", accessibility); 
object[] parms = new object[parameters.Length + 3]; 

for (j = 0; j < parameters.Length; j++) 
{ 
    parms[j] = parameters[j]; 
} 

parms[parms.Length - 3] = paramSkip; 
parms[parms.Length - 2] = paramTake; 
parms[parms.Length - 1] = paramRoles; 

var results = db.FullTextSearch.SqlQuery(query, parms); 


string query += String.Concat(@" 
    WHERE (FT_TBL.Accessibility = 0) OR ((FT_TBL.Accessibility & @Roles) > 0) 
    ORDER BY KEY_TBL.[RANK] DESC 
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY"); 
+0

MS SQL FTSは、私は驚いて、非常に洗練されていることを考えると(の知識)より柔軟な検索用語がありません。しかたがない。ありがとう、これは間違いなく私の最初の試みよりも優れています。 – GeoffM

+0

あります。たぶんhttp://dba.stackexchange.com/の質問質問をしてみることをお勧めします。もし本当にその底に到達したいのであれば(知識は力です)。もし誰かがFTSの全体と内部を知っているなら、たぶんそこにいる可能性が高いでしょう。私はMS SQLの機能よりも専門的なので、C#の観点からどのように取り組むべきかに基づいて答えました。あなたがそれをすることに決めたら、その結果を知ることに興味があります。 – GibralterTop