OrientDB 全文搜索多重匹配
OrientDB Full Text search multiple match
我有一个 Orient DB class "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")
但它将 return 与第一个查询相同的集合。
我试图在 Orient DB 手册中找到答案,例如此处:http://orientdb.com/docs/2.0/orientdb.wiki/FullTextIndex.html 但没有找到任何引导我找到解决方案的指导。
有人知道怎么处理这种情况吗?
已编辑 - 看来我没有准确说明问题。所以我在这里添加一个简短的例子:
假设我的数据库有 3 个 classes:
Nr FirstName LastName
-------------------------
1. Tim Tom
2. Tim Tim
3. Peter Tim Timar
"search request" "Ti* AND Ti*"
的结果应该是:
- 编号。 2(名字中有 1 个匹配项,姓氏中有 1 个匹配项)
- 和 Nr。 3(在姓氏中有 2 个匹配项)
- 但不是 Nr。 1(因为它只有 1 个匹配项)。
顺便说一句: 在这里,我试图简化我正在使用的域。在实际场景中,我有两个以上的字段要搜索,这就是为什么我需要一个通用的解决方案
尝试
select from User where [FirstName,LastName] LUCENE "(FirstName:Peter AND LastName:Peter)"
你可以看到这里 link 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)
Lucene是一个倒排索引结构,所以它主要不关心单个文档中的匹配次数。
检索文档是因为 term 与查询匹配。
写**tim* AND tim* ** 或 **tim* ** 具有相同的效果。
正如 Alessandro 建议的那样,您可以指定在哪个索引字段上应用查询。
请注意,这不是 Orient 问题,也不是 Lucene 问题:这是 Lucene 应该工作的方式。
我有一个 Orient DB class "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")
但它将 return 与第一个查询相同的集合。
我试图在 Orient DB 手册中找到答案,例如此处:http://orientdb.com/docs/2.0/orientdb.wiki/FullTextIndex.html 但没有找到任何引导我找到解决方案的指导。
有人知道怎么处理这种情况吗?
已编辑 - 看来我没有准确说明问题。所以我在这里添加一个简短的例子:
假设我的数据库有 3 个 classes:
Nr FirstName LastName
-------------------------
1. Tim Tom
2. Tim Tim
3. Peter Tim Timar
"search request" "Ti* AND Ti*"
的结果应该是:
- 编号。 2(名字中有 1 个匹配项,姓氏中有 1 个匹配项)
- 和 Nr。 3(在姓氏中有 2 个匹配项)
- 但不是 Nr。 1(因为它只有 1 个匹配项)。
顺便说一句: 在这里,我试图简化我正在使用的域。在实际场景中,我有两个以上的字段要搜索,这就是为什么我需要一个通用的解决方案
尝试
select from User where [FirstName,LastName] LUCENE "(FirstName:Peter AND LastName:Peter)"
你可以看到这里 link 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)
Lucene是一个倒排索引结构,所以它主要不关心单个文档中的匹配次数。
检索文档是因为 term 与查询匹配。
写**tim* AND tim* ** 或 **tim* ** 具有相同的效果。 正如 Alessandro 建议的那样,您可以指定在哪个索引字段上应用查询。 请注意,这不是 Orient 问题,也不是 Lucene 问题:这是 Lucene 应该工作的方式。