考虑我需要执行文本搜索的实体如下
Sample{
int ID, //Unique ID
string Name,//Searchable field
string Description //Searchable field
}
现在,我有几个这样的实体,它们通常由所有用户共享,但每个用户可以将不同的标签,Notes等关联到任何这些实体。为简单起见,假设用户可以向Sample实体添加标签。
UserSampleData{
int ID, //Sample ID
int UserID, //For condition
string tags //Searchable field
}
当用户执行搜索时,我想在当前用户的名称,描述和与该样本关联的标签中搜索给定字符串。我是使用lucene索引的新手,我无法想象如何设计索引以及针对这种情况的查询。我需要根据与搜索查询的相关性排序结果。我想到了以下方法,但我觉得可以有更好的解决方案:
答案 0 :(得分:3)
您可以使用JoinUtil
Lucene课程,但必须重命名第二个" ID
" UserDataSample
文档的字段为SAMPLE_ID
(或其他名称与" ID
")不同。
下面是一个例子:
r = DirectoryReader.open(dir);
final Version version = Version.LUCENE_47; // Your lucene version
final IndexSearcher searcher = new IndexSearcher(r);
final String fromField = "ID";
final boolean multipleValuesPerDocument = false;
final String toField = "SAMPLE_ID";
String querystr = "UserID:xxxx AND yourQueryString"; //the userID condition and your query String
Query fromQuery = new QueryParser(version, "NAME", new WhitespaceAnalyzer(version)).parse(querystr);
final Query joinQuery = JoinUtil.createJoinQuery(fromField, multipleValuesPerDocument, toField, fromQuery, searcher, ScoreMode.None);
final TopDocs topDocs = searcher.search(joinQuery, 10);
检查错误https://issues.apache.org/jira/browse/LUCENE-4824)。我不知道该错误是否自动解决到当前版本的LUCENE中,否则我认为您必须将ID字段的类型转换为String。