我有一个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*"
的结果应为:
顺便说一句:在这里,我尝试简化我正在使用的域名。在真实场景中,我有两个以上的字段需要搜索,这就是我需要通用解决方案的原因
答案 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)