symfony弹性搜索匹配确切的术语不起作用

时间:2017-02-01 15:27:46

标签: symfony elasticsearch foselasticabundle

我使用symfony与fos elastica捆绑但我有一些问题

我有一个实体内容与其他实体类别(名称和slugname)的链接x内容只有1个类别。

我已安装捆绑包并配置像这样的yml文件

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: ~

我希望有一些灵活性,但在内容类别slugname我想搜索完全单词例如arts-de-la-rue但是当我进行搜索时我发现结果有类别= arts或categorie =讲座,我不明白这个问题:( 如果有人可以帮助我:)。

3 个答案:

答案 0 :(得分:0)

您需要为此设置基于关键字的分析器。

分析仪上的ngram会破坏任何slu .. 每个字段可以设置多个不同的分析器,但我不知道FOS\ElasticaBundle是否支持https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

稍后,您可以针对此新原始字段执行“过滤”查询(术语过滤器)。

答案 1 :(得分:0)

您必须为该字段设置映射

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

只是为了确保破坏类型并重新填充它。

答案 2 :(得分:0)

感谢您的帮助,我在配置中犯了一些错误。我已经放置了一个嵌套的类型,事实上它的对象和属性的名称并不好。 现在它完美地工作了:))