【问题标题】:OrientDB Full Text search multiple matchOrientDB全文搜索多重匹配
【发布时间】:2015-11-24 13:54:06
【问题描述】:

我有一个带有“FirstName”和“LastName”字段的 Orient DB 类“user”,其中可能包含一个或多个单词(用户可以有更多的名字和姓氏)。这些字段 ["FirstName","LastName"] 上有一个 FULLTEXT LUCENE 索引。我可以创建一个查询来搜索这些字段中的任何单词:

SELECT FROM user WHERE ([FirstName,LastName] LUCENE "Peter")

我还可以创建查询来搜索多个关键字,例如:

SELECT FROM user WHERE ([FirstName,LastName] LUCENE "Peter AND Fa*")

但我不知道如何搜索同一个单词的多个匹配项。我试过了:

SELECT FROM user WHERE ([FirstName,LastName] LUCENE "Peter AND Peter")

但它会返回与第一个查询相同的集合。

我试图在 Orient DB 手册中找到答案,例如在这里:http://orientdb.com/docs/2.0/orientdb.wiki/FullTextIndex.html,但没有找到任何引导我找到解决方案的指导。

有人知道如何处理这种情况吗?

已编辑 - 看来,我没有准确地指定问题。所以我在这里添加一个简短的例子:

假设我的数据库有 3 个类:

Nr  FirstName     LastName
-------------------------
1.  Tim           Tom
2.  Tim           Tim
3.  Peter         Tim Timar

“搜索请求”"Ti* AND Ti*" 的结果应该是:

  • 编号。 2(FirstName 匹配 1 个,LastName 匹配 1 个)
  • 编号。 3(LastName 中有 2 个匹配项)
  • 但不是编号。 1(因为它只有 1 个匹配项)。

顺便说一句:我在这里尝试简化我正在使用的域。在实际场景中,我需要搜索两个以上的字段,这就是我需要通用解决方案的原因

【问题讨论】:

    标签: lucene orientdb


    【解决方案1】:

    Lucene 是倒排索引结构,所以它主要不关心单个文档中的匹配数。
    检索文档是因为 term 与查询匹配。

    写 **tim* AND tim* ** 或 **tim* ** 具有相同的效果。 正如 Alessandro 建议的那样,您可以指定在哪个索引字段上应用查询。 请注意,这不是东方问题,也不是 Lucene 问题:这是 Lucene 应该工作的方式。

    【讨论】:

      【解决方案2】:

      试试

      select from User where [FirstName,LastName] LUCENE "(FirstName:Peter AND LastName:Peter)"
      

      你可以在这个链接看到http://orientdb.com/docs/2.0/orientdb-lucene.wiki/Full-Text-Index.html#working-with-multiple-field

      编辑

      尝试创建一个函数js 示例:带有参数 myClass 和属性的我的函数

      var g=orient.getGraph();
      var b=g.command("sql","select from "+ myClass);
      property=property.substring(1,property.length-1).split(",");
      var array=[];
      for(i=0;i<b.length;i++){
        var count=0;
        for(j=0;j<property.length;j++){
              var myString=b[i].getProperty(property[j]);
              count = count + (myString.match(/Tim+/g) || []).length;
        }
        if(count>=property.length){
          array.push(b[i]);
        }
      }
      return array;
      

      并使用此命令select expand(result) from (select myFunction("User","[FirstName,LastName]") as result)

      【讨论】:

      • 感谢您的回答。我对这个解决方案的问题是它不会匹配姓氏两次包含相同子字符串并且名字不同的用户
      • 谢谢,也许我也会尝试这种方式。但是我提防这个解决方案。我必须在分页之前评估查询结果,所以会有很多记录要检查。
      猜你喜欢
      • 1970-01-01
      • 2019-09-22
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多