【问题标题】:Elasticsearch - How to specify the same analyzer for search and indexElasticsearch - 如何为搜索和索引指定相同的分析器
【发布时间】:2020-10-19 02:52:06
【问题描述】:

我正在开发一个西班牙搜索引擎。 (我不会说西班牙语)但根据我的研究,目标或多或少是这样的: 1. 过滤停用词,如“dos”、“de”、“la”... 2. 为两个搜索词干和索引。例如,如果您搜索“primera”,那么“primero”、“primer”也应该会出现。

我的尝试:

es_analyzer={
        "settings": {
            "analysis": {
            "filter": {
                "spanish_stop": {
                "type":       "stop",
                "stopwords":  "_spanish_" 
                },
                "spanish_stemmer": {
                "type":       "stemmer",
                "language":   "spanish"
                }
            },
            "analyzer": {
                "default_search": {
                    "type": "spanish"
                },
                "rebuilt_spanish": {
                "tokenizer":  "standard",
                "filter": [
                    "lowercase",
                    "spanish_stop",
                    "spanish_stemmer"
                ]
                }
            }
            }
        }
    }

问题: 当我在"default_search" 中使用"type":"spanish" 时,我的查询“primera”被终止为“primer”,这是正确的,但即使我指定在过滤器中使用"spanish_stemmer",索引中的文档也不是干的。因此,当我搜索“primera”时,它只显示“primer”的完全匹配。有什么解决这个问题的建议吗?

可能的修复,但我还没有弄清楚语法:

  1. 在过滤器中使用内置的"spanish" 分析器。语法是什么?
  2. "default_search" 中添加西班牙语词干分析器和停用词。但我不知道如何在那里使用复合设置。

【问题讨论】:

    标签: elasticsearch elasticsearch-analyzers


    【解决方案1】:

    添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

    索引映射:

     {
      "settings": {
        "analysis": {
          "filter": {
            "spanish_stop": {
              "type": "stop",
              "stopwords": "_spanish_"
            },
            "spanish_stemmer": {
              "type": "stemmer",
              "language": "spanish"
            }
          },
          "analyzer": {
            "default_search": {
              "type":"spanish",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "spanish_stop",
                "spanish_stemmer"
              ]
            }
          }
        }
      },
      "mappings":{
        "properties":{
          "title":{
            "type":"text",
            "analyzer":"default_search"
          }
        }
      }
    }
    

    索引数据:

    {
      "title": "primer"
    }
    {
      "title": "primera"
    }
    {
      "title": "primero"
    }
    

    搜索查询:

    {
      "query":{
        "match":{
          "title":"primer"
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "stof_64420517",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.13353139,
            "_source": {
              "title": "primer"
            }
          },
          {
            "_index": "stof_64420517",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.13353139,
            "_source": {
              "title": "primera"
            }
          },
          {
            "_index": "stof_64420517",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.13353139,
            "_source": {
              "title": "primero"
            }
          }
        ]
    

    【讨论】:

    • 非常感谢!只是一个问题,"default_search" 实际上是 Elasticsearch 中的一个关键字,而不是我创建的一些自定义分析器,请参见此处:elastic.co/guide/en/elasticsearch/reference/current/…。这有什么影响吗?
    • @XuekaiDu 感谢您的回复 :) 抱歉,我不知道 default_search 不是您的自定义分析器。但是查看文档,很明显它是一个默认的搜索分析器,可以在创建索引时进行设置。因此,为了避免这种混淆,您必须添加analyzer 设置(在映射中)
    • @XuekaiDu 分析器设置(在映射中)指向将在索引时使用的default_analyzer(在您的情况下)。如果您想在搜索时使用不同的分析器,我们还可以在映射中添加search_analyzer 设置。默认情况下,查询将使用与字段映射中定义的分析器相同的分析器(search_analyzer)。
    • @XuekaiDu 如果您不使用default_search 作为自定义分析器的名称会更好(以避免任何混淆)。但是,如果您没有忘记在映射中添加分析器设置,它不会对您的搜索结果产生任何影响
    • @XuekaiDu 请不要忘记点赞并接受我的回答,如果它帮助您解决了您的问题?
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2014-02-15
    • 2013-08-16
    相关资源
    最近更新 更多