使用lucene有条件地为不同用户搜索不同的数据

时间:2015-09-08 16:51:02

标签: lucene full-text-search lucene.net full-text-indexing

考虑我需要执行文本搜索的实体如下

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索引的新手,我无法想象如何设计索引以及针对这种情况的查询。我需要根据与搜索查询的相关性排序结果。我想到了以下方法,但我觉得可以有更好的解决方案:

  1. 分别查询2个不同的实体Samples和UserSampleData,并以某种方式混合2个结果。对于相交的结果,我们需要将匹配分数组合起来进行平均。
    1. 通过组合实体=>来展平数据相同ID的多个条目。

1 个答案:

答案 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。