2010-01-26 5 views
28

Nous avons plusieurs configurations de base dans SOLR et nous aimerions effectuer une recherche sur ces cœurs et retourner un ensemble de résultats unique.Recherche de plusieurs noyaux SOLR et retour d'un ensemble de résultats

Un peu plus d'arrière-plan: Nous avons un noyau SOLR que nous indexons notre moteur de blog interne. Nous avons également un noyau SOLR que nous indexons notre système CMS. Nous aimerions effectuer une recherche sur ces deux cœurs, mais nous ne voyons qu'un seul ensemble de résultats.

Je suis conscient d'avoir des entités apparentées dans un document, mais nous aimerions garder les cœurs séparés, pour faciliter la maintenance et la redondance. Nous utilisons SolrSharp comme un wrapper pour la recherche SOLR. Tout conseil ou orientation serait apprécié.

+0

quelle plate-forme client utilisez-vous? –

+0

Nous utilisons SolrSharp comme wrapper pour SOLR. –

Répondre

21

Depuis Solr 1.3, il y a eu des capacités de recherche multi-core décentes dans Solr. Veuillez lire l'article Distributed Search où il explique comment utiliser le paramètre shards pour interroger plusieurs cœurs et renvoyer les résultats sous la forme d'un ensemble de données.

+3

Est-ce que DistributedSearch fonctionne sur plusieurs cœurs différents? Je ne l'ai pas essayé moi-même, mais je me demande si ce serait malheureux si le noyau A a des champs "nom" et "titre" et le noyau B a des champs "nom" et "résumé", et donc ils ne correspondent pas? Ou souhaitez-vous récupérer le nom, le résumé et le titre, le cas échéant? –

+7

Eric - Ma stratégie consiste à utiliser un cœur séparé avec un schéma fusionné dont un gestionnaire de requêtes est implémenté pour rechercher plusieurs fragments. De cette façon, le client n'a pas besoin de fournir le paramètre "shards". – Brian

+4

Donc, si j'ai Core0 avec les champs documentId, fieldA, fieldB et Core1 avec les champs documentId, fieldC, fieldD. Ensuite, je crée un autre noyau, disons Core3 avec les champs documentId, fieldA, fieldB, fieldC, fieldD.Je ne vais jamais importer des données dans ce noyau? Puis créez un gestionnaire de requête, qui inclut le paramètre shard. Donc, quand j'interroge Core3, il ne contient jamais vraiment de données indexées, mais à cause de la recherche de tessons, il va chercher les résultats de l'autre dans les cœurs, et le "présenter" sur le 3ème noyau? Merci pour l'aide! –

19

Il n'existe aucun moyen d'exécuter une seule requête sur plusieurs cœurs. La Recherche distribuée mentionnée dans une autre réponse concerne les fragments qui répartissent les index entre les systèmes. En fait, les cœurs multiples servent en réalité à stocker des structures distinctes et différentes dans chacun et l'interrogation de plusieurs cœurs ne devrait pas avoir de sens. Comme certains l'ont mentionné dans les commentaires précédents, vous pouvez avoir un noyau supplémentaire qui contient tous vos champs - bien que vous deviez renommer les champs dans ce nouveau noyau afin que des champs similaires nommés mais différemment typés puissent tous deux être stockés.

3

La réponse de Mathew est exactement exacte. Les fragments et les multi-noyaux sont des pommes et des oranges. Vous ne pouvez pas avoir une requête unique unifiée sur plusieurs cœurs. Vous devez effectuer des requêtes individuelles par cœur (http: // localhost: 8983/solr/core0/select? Q = :, http: // localhost: 8983/solr/core1/select? Q = :). Avec des fragments cependant, (http: // localhost: 8983/solr/select? Shards = localhost: 8983/solr, localhost: 8984/solr & q = :).

1

La recherche distribuée est la bonne réponse. Je suggère de configurer la recherche distribuée directement dans le gestionnaire. Vous pouvez configurer localhost dans le gestionnaire, bien que vous puissiez appeler solr en externe. Maintenant, vous pouvez appeler le gestionnaire de recherche qui recherche automatiquement dans tous les noyaux configurés:

http://solrhost:8983/solr/core1?q=:

<requestHandler name="/multicore" class="solr.SearchHandler"> 
    ... 
    <lst name="invariants"> 
    <str name="shards">localhost:8983/solr/core1,localhost:8983/solr/core2</str> 
    </lst> 
</requestHandler> 
+0

Si core1 et core2 n'ont pas les mêmes schémas Le résultat est imprévisible Après tout, ce n'est pas une question de solvabilité pour un Solr. En un mot, il n'y a pas de réponse pour cette question difficile pour Solr. Même pour Elasticsearch, vous devez toujours écrire des codes pour vérifier quel type de source de données tapez un document est puis extraire le champ correspondant s (clé = nom du champ) d'un document spécifique. –

Questions connexes