Я бы использовал стиль td элемента наведения вместо tr . Например:
tr.fullrow:hover td{
background:yellow;
font-size:16px;
}
Хотя он реализован на Java, здесь вы можете увидеть один подход к решению этой проблемы: http://rcrezende.blogspot.com/2010/08/smallest-relevant-text-snippet-for.html
При использовании CONTAINSTABLE, Вы вернете РАЗРЯД, это - в сущности значение плотности - выше значение РАЗРЯДА, выше плотность. Таким образом, Вы просто выполняете запрос для получения результатов, которые Вы хотите и не должны заканчиваться к массированию данных когда его возвращенный.
Ну, вот является взломанный вместе версией, я сделал использование алгоритма, который я описал выше. Я не думаю, что это весь настолько большое. Это использует три (считайте их, три!) циклично выполняет массив и два списка. Но, ну, в общем, это лучше чем ничего. Я также hardcoded максимальная длина вместо того, чтобы превратить его в параметр.
private static string FindRelevantSnippets(string infoText, string[] searchTerms)
{
List<int> termLocations = new List<int>();
foreach (string term in searchTerms)
{
int termStart = infoText.IndexOf(term);
while (termStart > 0)
{
termLocations.Add(termStart);
termStart = infoText.IndexOf(term, termStart + 1);
}
}
if (termLocations.Count == 0)
{
if (infoText.Length > 250)
return infoText.Substring(0, 250);
else
return infoText;
}
termLocations.Sort();
List<int> termDistances = new List<int>();
for (int i = 0; i < termLocations.Count; i++)
{
if (i == 0)
{
termDistances.Add(0);
continue;
}
termDistances.Add(termLocations[i] - termLocations[i - 1]);
}
int smallestSum = int.MaxValue;
int smallestSumIndex = 0;
for (int i = 0; i < termDistances.Count; i++)
{
int sum = termDistances.Skip(i).Take(5).Sum();
if (sum < smallestSum)
{
smallestSum = sum;
smallestSumIndex = i;
}
}
int start = Math.Max(termLocations[smallestSumIndex] - 128, 0);
int len = Math.Min(smallestSum, infoText.Length - start);
len = Math.Min(len, 250);
return infoText.Substring(start, len);
}
Некоторые улучшения, о которых я мог думать, должны будут возвратить несколько "отрывков" с более коротким, которые составляют в целом более долгую длину - этот способ, которым могут быть выбраны несколько частей документа.
Это хорошая проблема :)
Я думаю, что я бы создал вектор индекса: для каждого слова создайте запись 1, если поисковый запрос, или в противном случае 0. Затем найдите i такой эта сумма (indexvector [i: i + maxlength]) максимизируется.
На самом деле это можно сделать довольно эффективно. Начните с количества поисковых запросов в первых словах максимальной длины. затем, по мере продвижения, уменьшайте свой счетчик, если indexvector [i] = 1 (т.е. вы теряете этот поисковый запрос при увеличении i), и увеличивайте его, если indexvector [i + maxlength + 1] = 1. По ходу следите за i с наибольшим значением счетчика.
После того, как у вас есть любимый i, вы все равно можете выполнить тонкую настройку, например, посмотреть, сможете ли вы уменьшить фактический размер без ущерба для счетчика, например чтобы найти границы предложения или что-то еще. Или как выбрать правильный i из числа с эквивалентными значениями счетчика.
Не уверен, что это лучший подход, чем ваш - это другой подход.
Возможно, вам также захочется ознакомиться с этим документом по теме, в котором содержится еще один базовый уровень: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.4357&rep = rep1 & type = pdf