OrientDB全文搜索多重匹配

时间:2015-11-24 13:54:06

标签: lucene orientdb

我有一个Orient DB类“user”,其中包含“FirstName”和“LastName”字段,这些字段可能包含一个或多个单词(用户可以拥有更多的名字和姓氏)。这些字段[“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但没有找到任何指导我的解决方案。

有人知道如何处理此类案件吗?

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

假设我的DB有3个类:

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

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

  • NR。 2 (在FirstName中匹配1,在LastName中匹配1)
  • Nr。 3 (LastName中的2个匹配项)
  • 但不是Nr。 1(因为它只有1个匹配)。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

尝试

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 示例:my function with parameter myClass and property

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)