Suggest sur plusieurs mots au milieu d'une expression


#1

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.


#3

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.


(system) #4