词干搜索的词干和突出显示

a p*_*erd 2 highlighting stemming elasticsearch

我的Elasticsearch索引中包含大量英文文档.当我搜索时"it is rare",我会用这个确切的短语获得20次点击,当我搜索时,"it is rarely"我得到一个不同的10.我怎样才能同时获得所有30次点击?

我尝试使用英语分析器创建一个多字段(下面),但是如果我在该字段中搜索,那么我只从短语的部分(例如,文档matchin it或isor rare)而不是整个短语中获得结果.

"mappings" : {
   ...
      "text" : {
        "type" : "string",
        "fields" : {
          "english" : {
            "type" : "string",
            "store" : true,
            "term_vector" : "with_positions_offsets_payloads",
            "analyzer" : "english"
          }
        }
      },
   ...
Run Code Online (Sandbox Code Playgroud)

a p*_*erd 8

弄清楚了!

  1. 存储两个字段,一个用于文本内容(text),另一个用于带有英语词干(text.english)的子字段.
  2. 根据默认的英语分析器创建自定义分析器,该分析器不会删除停用词.
  3. 突出显示两个字段,并在向用户显示结果时检查每个字段.

这是我的索引配置:

{
  mappings: {
    documents: {
      properties: {
        title: { type: 'string' },
        text: {
          type: 'string',
          term_vector: 'with_positions_offsets_payloads',
          fields: {
            english: {
              type: 'string',
              analyzer: 'english_nostop',
              term_vector: 'with_positions_offsets_payloads',
              store: true
            }
          }
        }
      }
    }
  },
  settings: {
    analysis: {
      filter: {
        english_stemmer: {
          type: 'stemmer',
          language: 'english'
        },
        english_possessive_stemmer: {
          type: 'stemmer',
          language: 'possessive_english'
        }
      },
      analyzer: {
        english_nostop: {
          tokenizer: 'standard',
          filter: [
            'english_possessive_stemmer',
            'lowercase',
            'english_stemmer'
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是查询的样子:

{
  query: {
    query_string: {
      query: <query>,
      fields: ['text.english'],
      analyzer: 'english_nostop'
    }
  },
  highlight: {
    fields: {
      'text.english': {}
      'text': {}
    }
  },
}
Run Code Online (Sandbox Code Playgroud)