Xquery поиск по нескольким ключевым словам - PullRequest
0 голосов
/ 01 мая 2011

Я написал базовый XQuery, который принимает параметр, выполняет «содержащий» параметр для данных и возвращает соответствующий набор данных.

let $search_term:= request:get-parameter("param1",0)
return 
  <root> { 
    for $node in doc('http://localhost:8080/data/doc.xml')/root/node
      for $value in $node/element/value
        where contains((upper-case($value)), (upper-case($search_term)))
      order by $node/title
      return $node
  } <root>

Как мне расширить его для поиска несколькихпараметры.В моем приложении Java пользователь вводит строку поиска в поле редактирования.Поэтому строка поиска может содержать много слов.В настоящее время этот код позволяет искать только в строке поиска как одну целую фразу.

Можно ли разобрать все слова в «param1» в последовательность строк в XQuery, а затем выполнить содержащую-любуюна этой последовательности.Наконец, в качестве дополнения, можно ли упорядочить результаты по количеству совпадений.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Вы, конечно, можете сделать что-то вроде замены

where contains((upper-case($value)), (upper-case($search_term)))

от

where some $v in tokenize($value, '\s'), $k in tokenize($search_term, '\s')
satisfies upper-case($v) = upper-case($k)

Тем не менее, я боюсь, что результаты могут разочаровать пользователей, привыкших к интеллектуальному поиску свободного текста, доступному из таких движков, как Google. Вместо того, чтобы строить свой собственный грубый поиск свободного текста, было бы лучше использовать что-то, что делает работу правильно.

0 голосов
/ 01 мая 2011

Вы должны написать анализатор поиска в Java или Xquery, чтобы сделать это. если это база данных Xquery, такая как MarkLogic или there-db, вы можете использовать их API поиска и индекс.

если вам нужен простой поиск по тексту с одним узлом, вы можете преобразовать ввод пользователя в REGEX и использовать fn: совпадения. Остерегайтесь инъекций XQuery в этом случае, хотя.

глядя на ваш фрагмент кода, я хотел бы предложить еще одну вещь. пожалуйста, рассмотрите возможность использования Xpath как можно больше, а не для цикла, который потребляет производительность.

...