2010-06-08 71 views
4

我目前正在使用Lucene.Net将数据从索引文件索引到数据库的搜索应用程序。我有一个产品目录,其中有名称,简短描述,sku和其他字段。数据使用StandardAnalyzer存储在索引中。我正在尝试为文本字段添加自动建议,并使用TermEnum从索引中获取所有关键字及其分数。但是返回的条款是单一期限的。例如,如果我输入co,则返回的建议是服装,计数,收藏,牛仔,组合等。但是我想要建议返回短语。对于〔实施例,如果我搜索合作,建议应该是牛仔服装,服装的大人,密码锁等使用Lucene.Net的多个单词Autosuggest

以下是用于获取建议代码:

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

正如您所说,“返回的条款是单一期限”。所以你需要创建由短语组成的术语。

您可以使用内置的ShingleFilter令牌过滤器来创建你的那句方面:

http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/analysis/shingle/ShingleFilter.html

您可能需要使用一个单独的领域这是我不知道是否ShingleFilter产生actully单条款 - 你可能会想试试这个。

+0

谢谢。我正在使用Lucene.net,并且不确定在.Net中使用ShingleFIlter的等效过滤器。让我试试看。 – eric 2010-06-11 14:12:38

1

您可以简单地使用Field.Index.NOT_ANALYZED参数或KeywordAnalyzer将您的产品名称索引到其他字段中,然后在其上运行通配符查询或前缀查询。