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

时间:2014-11-29 16:51:19

标签: elasticsearch highlighting stemming

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

我尝试使用英文分析器创建一个多字段(如下所示),但如果我在该字段中搜索,那么我只会从短语的部分内容中获得结果(例如,文档匹配it或{{ 1}}或is)而不是整个短语。

rare

1 个答案:

答案 0 :(得分:8)

想出来了!

  1. 存储两个字段,一个用于文本内容(text),另一个字段包含英语词干(text.english)。
  2. 根据default English analyzer创建一个不会删除停用词的自定义分析器。
  3. 突出显示两个字段,并在向用户显示结果时检查每个字段。
  4. 这是我的索引配置:

    {
      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'
              ]
            }
          }
        }
      }
    }
    

    以下是查询的内容:

    {
      query: {
        query_string: {
          query: <query>,
          fields: ['text.english'],
          analyzer: 'english_nostop'
        }
      },
      highlight: {
        fields: {
          'text.english': {}
          'text': {}
        }
      },
    }