76 votes

Quelle est l'utilité du type de champ "multiValued" dans Solr ?

Je suis nouveau dans Apache Solr. Même après avoir lu le documentation j'ai du mal à comprendre clairement la fonctionnalité et l'utilisation de l'outil de gestion de l'information. multiValued propriété du type de champ.

Comment Solr traite/traite/traite en interne un champ marqué comme étant multi-valeurs ?

Quelle est la différence dans l'indexation dans Solr entre un champ qui est multi-valeurs et ceux qui ne le sont pas ?

Quelqu'un peut-il expliquer avec un bon exemple ?

Le docteur dit :

multiValued=true|false

Vrai si cette champ peut contenir plusieurs valeurs par document, c'est-à-dire s'il peut apparaître plusieurs fois dans un document

77voto

Umar Points 1513

Un champ multivalent est utile lorsque le champ comporte plusieurs valeurs. Un exemple simple serait celui des balises, il peut y avoir plusieurs balises qui doivent être indexées. Donc, si nous avons le champ tags comme multivalué, la réponse de Solr renverra une liste au lieu d'une valeur de chaîne. Un point à noter est que vous devez soumettre plusieurs lignes pour chaque valeur des tags comme :

<field name="tags">tag1</tags>
<field name="tags">tag2</tags>
...
<field name="tags">tagn</tags>

Une fois que vous avez l'index de toutes les valeurs, vous pouvez rechercher ou filtrer les résultats par n'importe quelle valeur, par exemple, vous pouvez trouver tous les documents avec le tag1 en utilisant la requête suivante

q=tags:tag1

ou utiliser les balises pour filtrer les résultats comme

q=query&fq=tags:tag1

5 votes

Quelle est la différence/avantage de faire search or filter results by any value ? Dans ce cas, quelle différence cela fait-il de chercher avec tags:tag1 dans 'q' ou fq ?

1 votes

Chaque valeur peut être une chaîne de caractères et vous pouvez effectuer une correspondance exacte avec un ensemble de chaînes de caractères. Dans le cas d'un champ à valeur unique, vous pouvez avoir soit des mots tokenisés, soit une chaîne entière. Une autre utilisation consiste à stocker des valeurs qui sont des listes, comme je l'ai mentionné dans le cas des balises, qui peuvent être des nombres comme une liste de valeurs numériques.

6 votes

@Gnanam : Les requêtes filtrées sont mises en cache et n'affectent pas le score. Leur principal objectif est de créer un "sur-ensemble" fixe de documents, qui peut ensuite être recherché. Exemple : L'utilisateur saisit une requête et l'application applique des contraintes supplémentaires, par exemple pour rechercher uniquement les documents que l'utilisateur possède. Dans ce cas, l'application enverrait la contrainte "uniquement l'utilisateur donné" en tant que fq et la requête de recherche réelle comme q .

16voto

Asaf Points 3203

MultiValued définit dans le schéma si le champ est autorisé à avoir plus d'une valeur.

Par exemple :
si j'ai un fieldType appelé ID qui est multiValued=false en indexant un document comme celui-ci :

doc {
  id : [ 1, 2]
  ...
}

entraînerait la levée d'une exception dans le fil d'indexation et le document ne serait pas indexé (la validation du schéma échouerait).

D'un autre côté, si j'ai plusieurs valeurs pour un champ, je voudrais définir multiValued=true afin de garantir que l'indexation est effectuée correctement, par exemple :

doc {
  id : 1
  keywords: [ hello, world ]
  ...
}

Dans ce cas, vous définissez "keywords" comme un champ multivalué.

1 votes

Dites-moi si j'ai bien compris. Par exemple, si j'essaie d'indexer des données directement à partir de la base de données à l'aide de la fonction DataImportHandler et si l'un des champs de ma base de données étiquette le type est VARCHAR[] (tableau de type varchar), il serait alors logique de faire correspondre ce étiquette dans le champ du schéma solaire comme multi-valué. Ma compréhension est-elle correcte ?

1 votes

J'arrive tard dans la partie, mais je dirais généralement oui... mais il ne faut jamais dire jamais et ne jamais dire toujours...

12voto

waynet Points 71

Je n'utilise les champs à valeurs multiples qu'avec les champs de copie, alors pensez de cette façon, disons que tous les champs seront à valeur unique sauf s'il s'agit d'un champ de copie, par exemple j'ai les champs suivants :

<field name="id" type="string" indexed="true" stored="true"/>
<field name="name" type="string" indexed="true" stored="true"/>
<field name="subject" type="string" indexed="true" stored="true"/>
<field name="location" type="string" indexed="true" stored="true"/>

Je veux interroger un seul champ et éventuellement rechercher les 4 champs ci-dessus, alors nous devons utiliser copyfield. D'abord créer un nouveau champ appelé 'all', puis copier tout dans 'all'.

<field name="all" type="text" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="all"/>

Le champ "tous" doit maintenant être à valeurs multiples.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X