# Suggest sur plusieurs mots au milieu d'une expression

**URL:** <https://discuss.elastic.co/t/suggest-sur-plusieurs-mots-au-milieu-dune-expression/26216>\
**Category:** Discussions en français\
**Created:** [July 24, 2015, 7:32am UTC](https://discuss.elastic.co/t/suggest-sur-plusieurs-mots-au-milieu-dune-expression/26216 "2015-07-24T07:32:13Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Francis](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/francis/32/3840_2.png) [@Francis](https://discuss.elastic.co/u/Francis)\
**Post date:** [July 24, 2015, 7:32am UTC](https://discuss.elastic.co/t/suggest-sur-plusieurs-mots-au-milieu-dune-expression/26216/1 "2015-07-24T07:32:13Z")

</div>

Bonjour,  
Je rencontre un soucis à l'utilisation de l'API Suggest.

En effet j'ai ce type de données :

- Centre principal Le Havre
- Centre secondaire Le Havre
- Centre principal Amiens
- ....

Le Suggest fonctionne correctement lorsque je commence ma recherche par le mot "_centre_" mais si je tape "_le_" je n'ai aucun résultat.  
Je souhaiterais également que l'on puisse effectuer des recherches comme ceci "_le ha_" afin de ressortir les deux résultats correspondant aux centre du Havre.

J'ai essayé différentes manières de faire mais sans succès.

Voici mon mapping actuel:

```
"mappings": {
    "site": {
        "properties": {
            "id": {
                "type": "string",
                "index": "no",
                "store": true
            },
            "label": {
                "type": "string",
                "store": true
            },
            "status": {
                "type": "boolean",
                "store": true
            },
            "suggest": {
                "type": "completion",
                "analyzer": "simple",
                "payloads": true,
                "preserve_separators": true,
                "preserve_position_increments": true,
                "max_input_length": 50
            }
        }
    }
}

```

Voici les suggest sont indexés sous cette forme:

```
"suggest": {
    "input": "Centre principal Le Havre",
    "output": "Centre principal Le Havre",
    "payload": {
        "id": "11"
    }
}

```

J'arrive à rechercher mot par mot si mon input `"input": ["Centre", "principal", "Le", "Havre"]` mais pas avec plusieurs mots (par exemple "_Le Ha_").

J'ai également essayé d'utiliser l'analyzer _whitespace_ à la place de _simple_ mais même résultat que précédement.

Je me demande si c'est réellement l'API suggest qu'il me faut pour cela ou si une simple recherche pourrait mieux répondre à mes besoins, d'autant que j'ai la nécessité de rajouter un filtre pour avoir seulement les sites actifs.

Espérant que vous pourrez me guider.

---

<div class="post-metadata">

**Author:** ![Francis](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/francis/32/3840_2.png) [@Francis](https://discuss.elastic.co/u/Francis)\
**Post date:** [July 24, 2015, 11:22am UTC](https://discuss.elastic.co/t/suggest-sur-plusieurs-mots-au-milieu-dune-expression/26216/3 "2015-07-24T11:22:31Z")

</div>

Pour finir, je n'utilise pas l'API Suggest mais je lance une recherche en utilisant le filtre edgeNGram.  
Je met ma conf pour que ça puisse servir éventuellement à d'autres.

Analysis (utilisation de _edgeNGram_ filter):

```
{
    "analysis": {
        "filter": {
            "edge_NGram_filter": {
                "token_chars": [
                    "letter",
                    "digit"
                ],
                "min_gram": "2",
                "type": "edgeNGram",
                "max_gram": "20"
            }
        },
        "analyzer": {
            "edge_NGram_analyzer": {
                "type": "custom",
                "filter": [
                    "lowercase",
                    "asciifolding",
                    "edge_NGram_filter"
                ],
                "tokenizer": "whitespace"
            },
            "whitespace_analyzer": {
                "filter": [
                    "lowercase",
                    "asciifolding"
                ],
                "type": "custom",
                "tokenizer": "whitespace"
            }
        }
    }
}

```

Mapping :

```
{
    "mappings": {
        "site": {
            "properties": {
                "id": {
                    "type": "string",
                    "index": "no",
                    "store": true
                },
                "label": {
                    "type": "string",
                    "store": true,
                    "fields": {
                        "edge_ngram": {
                            "type": "string",
                            "index_analyzer": "edge_NGram_analyzer",
                            "search_analyzer": "whitespace_analyzer"
                        }
                    }
                },
                "status": {
                    "type": "integer",
                    "store": true
                }
            }
        }
    }
}

```

Recherche :

```
{
  "query": {
    "filtered": {
      "query": {
        "match": {
          "label.edge_ngram": "le ha"
        }
      },
      "filter": {
        "term": {
          "status": 200
        }
      }
    }
  }
}

```

Si vous pensez qu'il est possible de faire mieux je suis preneur.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:51pm UTC](https://discuss.elastic.co/t/suggest-sur-plusieurs-mots-au-milieu-dune-expression/26216/4 "2017-07-06T13:51:37Z")

</div>


