Bonjour,
Je cherche à faire de l’auto-complétion sur des champs de type "attachment".
J'ai suivis quelques tutos sur le web et j'en suis arrivé à un résultat de ce type:
Requête:
curl -X POST $ES_HOST/$ES_INDEX/$ES_INDEX_TYPE/_search?pretty -d '
{
"size": 0,
"query" : {
"prefix": {
"autocomplete": {
"value": "auth"
}
}
},
"aggs": {
"autocomplete": {
"terms": {
"field": "autocomplete",
"order": {
"_count": "desc"
},
"include": {
"pattern": "auth.*"
}
}
}
}
}'
Résultat:
{
"took" : 20,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 16,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"autocomplete" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 138,
"buckets" : [ {
"key" : "auth",
"doc_count" : 16
}, {
"key" : "authe",
"doc_count" : 16
}, {
"key" : "authen",
"doc_count" : 16
}, {
"key" : "authent",
"doc_count" : 16
}, {
"key" : "authenti",
"doc_count" : 16
}, {
"key" : "authentif",
"doc_count" : 16
}, {
"key" : "authentifi",
"doc_count" : 16
}, {
"key" : "authentific",
"doc_count" : 15
}, {
"key" : "authentifica",
"doc_count" : 15
}, {
"key" : "authentificat",
"doc_count" : 15
} ]
}
}
}
Comme vous pouvez le voir, l'auto-complétion fonctionne plutôt bien, mais elle renvoie des résultats qui ne sont pas dans mes documents (comme authe, authen, authent, authenti, authentif, ...). Si je ne me trompe pas, je récupère tous les Edge NGram qui match avec auth.
Voici mon index:
curl -X PUT $ES_HOST/$ES_INDEX/?pretty -d '
{
"settings": {
"index": {
"analysis": {
"filter": {
"edgeNGram_filter": {
"type": "edgeNGram",
"side": "front",
"min_gram": "1",
"max_gram": "20"
}
},
"analyzer": {
"autocomplete_index_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": ["standard", "lowercase", "asciifolding", "edgeNGram_filter"]
},
"autocomplete_search_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": ["standard", "lowercase", "asciifolding"]
}
}
}
}
}
}'
mon Mapping:
curl -X PUT $ES_HOST/$ES_INDEX/$ES_INDEX_TYPE/_mapping?pretty -d '
{
"properties": {
"autocomplete": {
"type": "string",
"search_analyzer": "autocomplete_search_analyzer",
"index_analyzer": "autocomplete_index_analyzer"
},
"file": {
"type": "attachment",
"path": "full",
"fields": {
"name": {"store": "yes"},
"language": {"store": "yes"},
"file": {
"store": "yes",
"term_vector": "with_positions_offsets",
"copy_to": ["autocomplete"]
}
}
}
}
}'
et enfin la façon dont j'index mes documents:
curl -X POST $ES_HOST/$ES_INDEX/$ES_INDEX_TYPE?pretty -d '
{
"path": "chemin/du/document",
"file" : {
"_name": "mon_nom",
"_language": "fr",
"_indexed_chars": "-1",
"_content": "... base 64 ..."
}
}'
Ma demande est la suivante, que faire pour obtenir uniquement les mots existants dans les champs "file" et "path" (Authentification, Authentifié, Authentifier, ...) ?
Je suis également preneur de tout conseil qui m'aiderait à mieux comprendre et gérer ElasticSearch
En vous remerciant !
Jérôme Pinot