2013-07-17 7 views
2

Je veux indexer le champ suivant:Comment indexer ce champ dans ElasticSearch?

quick brown fox 

Alors que la recherche d'exactement tous les 3 mots, dans l'ordre, frappera, mais une recherche pour seulement quelques-uns des mots, (comme ' renard brun '), va manquer.

En d'autres termes, je veux créer un index/requête pour ce qui suit est vrai:

# input for field 
quick brown fox 

# hits 
brown fox quick 
fox quick brown 
quick brown fox 
... 

# misses 
quick brown 
fox 
quick brown fox red 
... 

Il semble que je dois faire une coutume tokenizer de le faire. Un tokenizer qui explose un flux d'entrée dans ces permutations de mots-clés. Je ne sais pas par où commencer. J'utilise ruby ​​/ pneu. Est-ce la bonne idée? Comment puis-je créer mon propre tokenizer?

+0

Vous ne pouvez pas utiliser une requête de correspondance avec l'opérateur AND, de sorte que tous les termes de la requête doivent apparaître dans les documents correspondants? L'ordre ne compterait pas à moins que vous ne fassiez une requête qui prenne en compte des positions comme une requête de phrase ou une requête de span. Est-ce que je manque quelque chose? – javanna

+0

@javanna Non, je ne pense pas que je peux. Si je vous comprends bien, une requête pour 'fox' ne correspondrait-elle pas au champ 'quick brown fox'? J'essaie de créer un index où 'fox' ne correspond pas au champ 'quick brown fox' car l'utilisateur n'a pas inclus 'quick' ou' brown' dans la requête. Avoir du sens? –

+0

A droite, j'avais le sentiment qu'il me manquait quelque chose. Peut-être pourriez-vous préciser dans votre question que ce sont des questions qui devraient ou ne devraient pas correspondre au document. Je ne sais pas ce que le usecase est, de toute façon ... ouais vous avez besoin de créer votre propre tokenizer, ne sais pas si vous pouvez obtenir ce que vous voulez combiner ceux qui existent déjà. Qu'avez-vous essayé? – javanna

Répondre

1

Je trier ces mots par ordre alphabétique, les combiner ensemble en utilisant une séparation qui ne pouvait pas apparaître dans les mots et les indexer comme un seul jeton pas analysé. Ainsi, quick brown fox serait indexé comme brown-fox-quick. Vous devrez effectuer cette opération au cours de l'indexation et de la recherche. Idéalement, cela devrait être fait par un analyseur, mais je ne connais aucun analyseur capable de faire quelque chose comme ça pour vous. Vous devez donc écrire votre propre analyseur personnalisé (en tant que plugin java) ou implémenter cette logique dans votre code en dehors d'elasticsearch.

+0

Bonne idée. J'aime la simplicité de la commande à l'index _AND_ temps de requête sur ma pensée originale. –

Questions connexes