我目前正在开发一个搜索应用程序,它使用Lucene.Net将数据从数据库索引到索引文件。我有一个产品目录,其中包括名称,简短描述,sku和其他领域。使用StandardAnalyzer将数据存储在Index中。我正在尝试为文本字段添加自动建议,并使用TermEnum从索引中获取所有关键字术语及其分数。但返回的条款是单期的。例如,如果我键入co,则返回的建议是服装,计数,收集,牛仔,组合等。但我希望建议返回短语。例如,如果我搜索co,建议应该是牛仔服装,成人服装,组合锁等。
以下是用于获取建议的代码:
public string[] GetKeywords(string strSearchExp)
{
IndexReader rd = IndexReader.Open(mIndexLoc);
TermEnum tenum = rd.Terms(new Term("Name", strSearchExp));
string[] strResult = new string[10];
int i = 0;
Dictionary<string, double> KeywordList = new Dictionary<string, double>();
do
{
//terms = tenum.Term();
if (tenum.Term() != null)
{
//strResult[i] = terms.text.ToString();
KeywordList.Add(tenum.Term().text.ToString(), tenum.DocFreq());
}
} while (tenum.Next() && tenum.Term().text.StartsWith(strSearchExp) && tenum.Term().text.Length > 1);
var sortedDict = (from entry in KeywordList orderby entry.Value descending select entry);
foreach (KeyValuePair<string, double> data in sortedDict)
{
if (data.Key.Length > 1)
{
strResult[i] = data.Key;
i++;
}
if (i >= 10) //Exit the for Loop if the count exceeds 10
break;
}
tenum.Close();
rd.Close();
return strResult;
}
任何人都可以给我指示这个吗?感谢您对此进行调查。
答案 0 :(得分:1)
您可以使用Field.Index.NOT_ANALYZED
参数或KeywordAnalyzer
在不同的字段中索引产品名称,然后在其上运行通配符查询或前缀查询。
答案 1 :(得分:0)
正如你所说,“所返回的条款是单期的”。因此,您需要创建由短语组成的术语。
您可以使用内置的ShingleFilter令牌过滤器来创建词组术语:
http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/analysis/shingle/ShingleFilter.html
你可能想要使用一个单独的字段,因为我不确定ShingleFilter是否会产生单个术语 - 你可能想要试验这个。