2015-11-24 7 views
0

У меня есть пользовательский адрес класса «Orient DB» с полями «FirstName» и «LastName», которые могут содержать одно или несколько слов (у пользователей может быть больше фамилии и фамилии). В этих полях есть индекс 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, но не нашел никаких указаний, которые привели меня к решению.

Кто-нибудь знает, как бороться с такими случаями?

EDITED - Кажется, что я точно не задал вопрос. Так что я добавить небольшой пример здесь:

Предположим, что мой DB имеет 3 класса:

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

Результаты для "поиска запрос" "Ti* AND Ti*" должен быть:

  • Nr. 2 (1 совпадение в FirstName, 1 совпадение в LastName)
  • и Nr. 3 (2 соответствий в LastName)
  • но не Nr. 1 (так как он имеет только 1 матч вообще).

Btw: Здесь я попытался упростить домен я работаю с. В реальном сценарии у меня больше, чем два поля для поиска, поэтому мне нужно общее решение

ответ

1

Lucene представляет собой перевернутую структура индекса, поэтому она в основном не заботится о подсчете совпадений внутри одного документа.
Документ получен из-за того, что термин соответствует запросу.

Письмо ** tim * AND tim * ** или ** tim * **, такой же эффект. Как предложил Алессандро, вы можете указать, в каком индексированном поле применить запрос. Обратите внимание, что это не проблема Orient и 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

Edited

Try для создания функции 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)

+0

Спасибо за ответ. Моя проблема с этим решением заключается в том, что он не будет соответствовать пользователям, где Last name содержит одну и ту же подстроку дважды и имеет разные FirstName –

+0

Спасибо, может быть, я попробую и так. Однако я остерегаюсь этого решения. Я должен оценить результат запроса перед разбиением на страницы, чтобы было много записей для проверки. –

Смежные вопросы