2013-01-09 2 views
1

J'utilise Oracle 11g et Oracle Text pour un moteur de recherche Web.Recherche dans une colonne avec des valeurs séparées par des virgules dans Oracle

J'ai maintenant créé & une colonne CLOB Keywords contenant des mots séparés par des espaces. Cela m'a permis d'étendre la recherche, car Oracle Text retournera les lignes contenant un ou plusieurs mots-clés stockés dans cette colonne. Le contenu de la colonne est caché à l'utilisateur et est utilisé uniquement pour "étendre" la recherche. Cela fonctionne comme prévu. Mais maintenant j'ai besoin de supporter plusieurs mots ou même des phrases complètes. Avec la configuration actuelle, Oracle Text recherchera uniquement les mots-clés individuels. Comment ai-je besoin de stocker les phrases et de configurer Oracle Text pour qu'il recherche des phrases entières (la correspondance exacte est préférable, mais la correspondance floue est bonne aussi)?

exemple contenu colonne de deux lignes (valeurs séparées point-virgule):

"hello, hello; is there anybody out there?; nope;" 
"just the; basic facts;" 

J'ai trouvé une question similaire: Searching a column with comma separated values, sauf que je besoin d'une solution pour Oracle 11g avec ses fonctionnalités de recherche FreeText.

solutions possibles:

1ère solution: je pense à redessiner le DB comme suit. Je ferais une nouvelle table Keywords(pkID NUMBER, nonUniqueID NUMBER, singlePhrase VARCHAR2(100 BYTE)). Et je changerais la colonne précédente Keyword en KeywordNonUniqueID, qui contiendrait l'ID (au lieu d'une liste de valeurs). Au moment de la recherche, je voudrais INNER JOIN avec la nouvelle table Keyword. Le problème avec cette solution est que j'obtiendrai plusieurs lignes qui contiennent les mêmes données sauf la phrase. Je suppose que cela va détruire le classement?

2ème solution: Est-il possible de stocker des phrases au format XML dans la colonne Keyword d'origine, et d'une manière ou d'une autre dire à Oracle Text de chercher dans le XML?

3ème solution:?

Notez que, généralement, il n'y aura pas beaucoup de phrases (moins de 100), et elles ne seront pas longues (une seule phrase aura jusqu'à 5 mots).

Notez également que j'utilise actuellement CONTAINS et quelques-uns de ses opérateurs pour mes recherches de texte intégral.

EDIT: Cette discussion https://forums.oracle.com/forums/thread.jspa?messageID=10791361 qui résout presque mon problème, mais il correspond également aux mots individuels, pas la phrase entière (correspondance exacte).

Répondre

1

Oracle prend en charge la recherche de phrases par défaut. En docs, nous pouvons voir ce

4.1.4.1 CONTIENT Phrase Requêtes

Si plusieurs mots sont contenus dans une expression de requête, séparés seulement par des espaces vides (aucun opérateur), est considérée comme la chaîne de mots une phrase et Oracle Text recherche la chaîne entière pendant une requête. Par exemple, pour trouver tous les documents qui contiennent l'expression droit international, entrez votre requête avec la phrase loi internationale.Est-ce que j'ai répondu à votre question ou vous ai-je mal compris?

P.S. Il me semble que la solution est de convertir

« bonjour, bonjour, est-ce qu'il ya quelqu'un là-bas ?; Nope; » "juste les; faits de base;"

à

"bonjour, bonjour aa est-il quelqu'un là-bas? Aa Nope aa" "juste aa base des faits aa"

et recherche avec CONTIENT pour l'expression "

+0

Ce n'est pas ce que j'aime (bien que cette solution puisse donner assez de résultats pour mes besoins), car elle va aussi trouver des documents qui contiennent la phrase:" international "droit international", car l'expression "droit international" est contenue dans ce document. Ce que je veux, c'est que Oracle DB renvoie les documents qui correspondent exactement à une phrase/chaîne, ou pas du tout. – Howie

+0

Peut être que vous pouvez utiliser des chaînes de recherche avec des délimiteurs. Autrement dit, utilisez l'expression "droit international"; et cela ne correspondra pas au texte "droit international et tribunal". Si Oracle Text n'inclut pas de point-virgule dans les mots, nous pouvons ajouter des symboles stupides à la fin des phrases. Par exemple, le texte "droit international" et le "droit international et le tribunal" seront différents. Une seule note: vous devez vérifier l'existence d'un mot avec un symbole muet. C'est-à-dire que si nous choisissons «a» comme symbole muet et que nous cherchons une phrase se terminant par le mot «abac», nous pouvons obtenir des correspondances erronées avec le mot «abaca». C'est rare mais on peut ajouter "aa" :) – knagaev

+0

C'est dingue, mais ça pourrait (_will_) marcher! :) – Howie

Questions connexes