Bonjour tout le monde,
Je cherche à mettre en place un text search avec possibilité de filtrer par tags.
Le filtrage par tag fonctionne parfaitement, par contre j'ai quelque soucis à obtenir la précision souhaité pour le text search.
Voici mon commandes Sense, incluant analyzer et mapping:
DELETE guide
PUT guide
{
"settings": {
"analysis": {
"analyzer": {
"custom_index_analyzer": {
"type" : "custom",
"tokenizer" : "nGram",
"filter": ["stopwords", "asciifolding" ,"lowercase", "snowball", "elision", "worddelimiter", "stemmer"]
},
"custom_search_analyzer": {
"type" : "custom",
"tokenizer" : "standard",
"filter": ["stopwords", "asciifolding" ,"lowercase", "snowball", "elision", "worddelimiter", "stemmer"]
}
},
"tokenizer": {
"nGram": {
"type": "nGram",
"min_gram": 2,
"max_gram": 20
}
},
"filter": {
"elision": {
"type": "elision",
"articles_case": true,
"articles": [
"l", "m", "t", "qu", "n", "s",
"j", "d", "c", "jusqu", "quoiqu",
"lorsqu", "puisqu"
]
},
"snowball": {
"type": "snowball",
"language": "French"
},
"stopwords": {
"type": "stop",
"stopwords": "_french_",
"ignore_case": true
},
"worddelimiter": {
"type": "word_delimiter"
},
"stemmer": {
"type": "stemmer",
"language": "light_french"
}
}
}
}
}
PUT guide/commerce/_mapping
{
"properties": {
"address": {
"properties": {
"line": {
"type": "string",
"analyzer": "custom_index_analyzer",
"search_analyzer": "custom_search_analyzer"
},
"city": {
"type": "string",
"analyzer": "custom_index_analyzer",
"search_analyzer": "custom_search_analyzer"
},
"postal_code": {
"type": "string"
}
}
},
"description": {
"type": "string",
"analyzer": "custom_index_analyzer",
"search_analyzer": "custom_search_analyzer"
},
"name": {
"type": "string",
"analyzer": "custom_index_analyzer",
"search_analyzer": "custom_search_analyzer"
}
"tags": {
"type": "string",
"index": "not_analyzed"
}
}
}
# Indexation de documents
PUT guide/commerce/1
{
"name": "Mon commerce",
"address": {
"line": "123 rue Machin",
"city": "Avignon",
"postal_code": "84000"
},
"description": "Un permier commerce avec des articles.",
"tags": ["restaurant", "boucherie"]
}
PUT guide/commerce/2
{
"name": "À la bonne fourchette",
"address": {
"line": "450 rue Machin",
"city": "Avignon",
"postal_code": "84000"
},
"description": "Venez manger du bon poulet.",
"tags": ["restaurant", "café"]
}
Et voici la recherche que j'effectue:
GET /guide/commerce/_search
{
"query" : {
"filtered" : {
"query": {
"match": {
"_all": "article"
}
},
"filter" : {
"bool": {
"must": [
{"term": {"tags": "restaurant"}},
{"term": {"tags": "boucherie"}}
]
}
}
}
}
}
Vous pouvez voir que je cherche pour article
en espérant que ça match articles
au pluriel dans la description de mon commerce avec l'id1.
Malheureusement, je n'ai aucun résultats. Même chose si je table "fourchete" à la place de "fourchette".
D'après ma compréhension, les filtres snowball et stemmer auraient m'aider à supporter ce genre de recherche.
Qu'ai-je mal compris et fait ?
Merci.