2015-11-24 112 views
0

我有一個OrientName DB類「用戶」與「名字」和「姓氏」字段,可能包含一個或多個單詞(用戶可以有更多的名字和姓氏)。這些字段上有一個FULLTEXT LUCENE索引[「FirstName」,「LastName」]。我可以創建一個查詢,在這些領域,以搜索任何單詞:OrientDB全文搜索多個匹配

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(1位匹配名,1位匹配姓)
  • Nr。 3(2匹配姓氏)
  • 但不是Nr。 1(因爲它只有一場比賽)。

btw:在這裏,我試圖簡化我正在使用的域。在真實的情景我有兩個以上領域的搜索,這就是爲什麼我需要一個通用的解決方案

回答

1

Lucene是一個倒排索引結構,因此它主要不關心單個文檔內匹配的計數。
由於條款與查詢匹配,因此檢索到該文檔。

書寫** tim *和tim * **或** tim * **,具有相同的效果。 正如亞歷山德羅建議的那樣,您可以指定在哪個索引字段上應用查詢。 請注意,這不是一個東方問題,也不是一個Lucene問題:這是Lucene應該工作的方式。

+0

謝謝,這是一個有用的信息 –

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函數帶參數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)

+0

感謝您的回答。我對這個解決方案的問題是,它不會匹配用戶在哪裏姓氏包含相同的子字符串兩次,並有不同的名字 –

+0

謝謝,也許我會嘗試這種方式以及。但是我小心這個解決方案。我必須在分頁之前評估查詢結果,這樣會有很多記錄需要檢查。 –