analyzer编辑

只有 text 字段支持 analyzer 映射参数。

analyzer 参数指定用于对 text 字段进行索引或搜索时进行 文本分析分析器

除非使用 search_analyzer 映射参数覆盖,否则此分析器将用于 索引和搜索分析。请参阅 指定分析器

我们建议在生产环境中使用分析器之前对其进行测试。请参阅 测试分析器

analyzer 设置不能使用 更新映射 API 在现有字段上更新。

search_quote_analyzer编辑

search_quote_analyzer 设置允许您为短语指定一个分析器,这在处理禁用短语查询的停用词时特别有用。

要禁用短语的停用词,需要使用三个分析器设置的字段

  1. 一个 analyzer 设置用于索引所有术语,包括停用词
  2. 一个 search_analyzer 设置用于非短语查询,它将删除停用词
  3. 一个 search_quote_analyzer 设置用于短语查询,它不会删除停用词
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase'
            ]
          },
          my_stop_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase',
              'english_stop'
            ]
          }
        },
        filter: {
          english_stop: {
            type: 'stop',
            stopwords: '_english_'
          }
        }
      }
    },
    mappings: {
      properties: {
        title: {
          type: 'text',
          analyzer: 'my_analyzer',
          search_analyzer: 'my_stop_analyzer',
          search_quote_analyzer: 'my_analyzer'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    title: 'The Quick Brown Fox'
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    title: 'A Quick Brown Fox'
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      query_string: {
        query: '"the quick brown fox"'
      }
    }
  }
)
puts response
PUT my-index-000001
{
   "settings":{
      "analysis":{
         "analyzer":{
            "my_analyzer":{ 
               "type":"custom",
               "tokenizer":"standard",
               "filter":[
                  "lowercase"
               ]
            },
            "my_stop_analyzer":{ 
               "type":"custom",
               "tokenizer":"standard",
               "filter":[
                  "lowercase",
                  "english_stop"
               ]
            }
         },
         "filter":{
            "english_stop":{
               "type":"stop",
               "stopwords":"_english_"
            }
         }
      }
   },
   "mappings":{
       "properties":{
          "title": {
             "type":"text",
             "analyzer":"my_analyzer", 
             "search_analyzer":"my_stop_analyzer", 
             "search_quote_analyzer":"my_analyzer" 
         }
      }
   }
}

PUT my-index-000001/_doc/1
{
   "title":"The Quick Brown Fox"
}

PUT my-index-000001/_doc/2
{
   "title":"A Quick Brown Fox"
}

GET my-index-000001/_search
{
   "query":{
      "query_string":{
         "query":"\"the quick brown fox\"" 
      }
   }
}

search_quote_analyzer 设置可以使用 更新映射 API 在现有字段上更新。

my_analyzer 分析器,它对所有术语(包括停用词)进行标记

my_stop_analyzer 分析器,它删除停用词

analyzer 设置指向 my_analyzer 分析器,它将在索引时使用

search_analyzer 设置指向 my_stop_analyzer,并为非短语查询删除停用词

search_quote_analyzer 设置指向 my_analyzer 分析器,并确保从短语查询中不删除停用词

由于查询被包含在引号中,因此它被检测为短语查询,因此 search_quote_analyzer 会生效,并确保从查询中不删除停用词。然后,my_analyzer 分析器将返回以下标记 [the, quick, brown, fox],它将与其中一个文档匹配。同时,术语查询将使用 my_stop_analyzer 分析器进行分析,该分析器将过滤掉停用词。因此,搜索 The quick brown foxA quick brown fox 将返回两个文档,因为两个文档都包含以下标记 [quick, brown, fox]。如果没有 search_quote_analyzer,将无法对短语查询进行精确匹配,因为短语查询中的停用词将被删除,导致两个文档都匹配。