match_phrase不适用于分析的索引

时间:2017-05-10 07:31:26

标签: python elasticsearch elasticsearch-5

我确实读过这个post,但我并不完全明白如何应用它。

我对我的索引进行了分析,我想知道我是否可以搜索没有屈折形式的短语。

es.indices.create(index='bhar',body = {
 "settings":{
  "analysis":{
   "analyzer":{
    "my_stop_analyzer":{
     "type":"custom",
     "tokenizer":"standard",
     "filter":        ["english_possessive_stemmer","lowercase","english_stop","english_stemmer"]
              }
             },"filter":{
               "english_stop":{
                    "type":"stop",
                    "stopwords":"_english_"
                               },
                                 "english_stemmer":{
                                   "type":"stemmer",
                                   "name":"english"
                                    },
                                 "english_possessive_stemmer": {
                                   "type": "stemmer",
                                   "language": "possessive_english"
                                    }}}},
                          "mappings":{
                            "my_type":{
                               "properties":{
                                  "test": {
                                    "type":"text",
                                    "analyzer" : "my_stop_analyzer"
                                     }
                                     }
                                     }
                                     }
                                     })

`

一条记录的数据是"选择高耸"。 当我搜索" pick tower"时,它仍然给我一个match_phrase的结果,我写的是这样的:

scroll = elasticsearch.helpers.scan(es, query={
    "query":{
    "match_phrase":{ 
    "test":{
    "query":"pick rule"
          }
                 }
          }
 },index='bhar', scroll='100s')`

有什么方法可以得到这句话的完全匹配?谢谢

1 个答案:

答案 0 :(得分:1)

您的分析器正在更改已编制索引的条款,并且无法保留原始文本。 我的建议是稍微改变你的映射:

    "test": {
      "type": "text",
      "analyzer": "my_stop_analyzer",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }

并在您的查询中介绍"完全匹配"选项:

"match_phrase": {
  "test.keyword": "picks towering"
}

  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "test.keyword": "picks towering"
          }
        },
        {
          "match_phrase": {
            "test": "picks towering"
          }
        }
      ]
    }
  }

上面的第二种查询意味着不会干扰您已经拥有的任何其他查询。