Search code examples
symfonyelasticsearchfoselasticabundle

symfony elastic search match exact term not working


I use symfony with fos elastica bundle but i have some problems

I have an entity content with link with other entity categorie (with name and slugname) x content have only 1 category.

I have install the bundle and configure the yml files like this

fos_elastica:
clients:
    default: { host: 127.0.0.1, port: 9200 }
serializer:
    callback_class: FOS\ElasticaBundle\Serializer\Callback
    serializer: serializer
indexes:
   portail:
        client: default
        settings:
            index:
                analysis:
                    analyzer:
                        custom_analyzer :
                            type: custom
                            tokenizer: nGram
                            char_filter:  [html_strip]
                            filter: [stopwords, lowercase, snowball, elision]
                        custom_analyzer_simple :
                            type: custom
                            tokenizer: whitespace
                            filter: [lowercase]
                        custom_search_analyzer :
                            type: custom
                            char_filter:  [html_strip]
                            tokenizer: whitespace
                            filter: [stopwords, lowercase, snowball, elision]
                        custom_search_analyzer_simple :
                            type: custom
                            tokenizer: whitespace
                            filter: [lowercase]
                    tokenizer:
                        nGram:
                            type: nGram
                            min_gram: 4
                            max_gram: 20
                    filter:
                        snowball:
                            type: snowball
                            language: French
                        elision:
                            type: elision
                            articles: [l, m, t, qu, n, s, j, d]
                        stopwords:
                            type: stop
                            stopwords: [_french_]
                            ignore_case : true
                        worddelimiter :
                            type: word_delimiter                            
        types:
            Content:
                mappings:
                    titre:
                        type: string
                        index_analyzer: custom_analyzer
                        search_analyzer : custom_search_analyzer
                    preview:
                        type: string
                        index_analyzer: custom_analyzer
                        search_analyzer : custom_search_analyzer
                    contenu:
                        type: string
                        index_analyzer: custom_analyzer
                        search_analyzer : custom_search_analyzer
                    categorie:
                        type: object
                        properties:
                            slugnom:
                                type: string
                                index: not_analyzed
                                search_analyzer : custom_search_analyzer_simple
                persistence:
                    driver: orm
                    model:  PO\EtablissementBundle\Entity\Content
                    provider: ~
                    listener:
                        logger: true
                    finder: ~
            Page:
                mappings:
                    titre:
                        type: string
                        index_analyzer: custom_analyzer
                        search_analyzer : custom_search_analyzer
                persistence:
                    driver: orm
                    model:  PO\EtablissementBundle\Entity\PageEtablissement
                    provider: ~
                    listener:
                        logger: true
                    finder: ~
            Etablissement:
                mappings:
                    nom:
                        type: string
                        index_analyzer: custom_analyzer
                        search_analyzer : custom_search_analyzer
                    contents:
                        type: object
                    categories:
                        type: nested
                        properties:
                            slugnom:
                                type: string
                                index: not_analyzed
                                search_analyzer : custom_search_analyzer_simple
                    sous_categories:
                         type: nested
                         properties:
                             slugnom:
                                 type: string
                                 index: not_analyzed
                persistence:
                    driver: orm
                    model:  PO\EtablissementBundle\Entity\Etablissement
                    provider: ~
                    listener:
                        logger: true
                    finder: ~

I want to have some flexibility but on the content categorie slugname i want to search exactly the word for example arts-de-la-rue but when i make a search i found result with categorie = arts or categorie = lecture, i don't understand the problem :( If somebody can help me :)


Solution

  • You have to setup your mapping for that field

    your field: { type: "string", index: "not_analyzed" }
    

    And just to be sure destroy the type and populate it again.