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

symfony elastic search match exact term not working

我将 symfony 与 fos elastica 捆绑包一起使用,但我遇到了一些问题

我有一个实体内容 link 与其他实体类别(名称和 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,但是当我进行搜索时,我发现结果是 categorie = arts 或 categorie = lecture ,我不明白这个问题:( 如果有人可以帮助我:)

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

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

稍后您可以针对这个新的原始字段执行 "filtered" 查询(术语过滤器)。

您必须为该字段设置映射

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

为了确保销毁类型并重新填充它。

感谢您的帮助,我在配置中犯了一些错误。我已经嵌套了一个类型,实际上它是对象,属性的名称不好。 现在它运行完美:)