Elasticsearch无法使用'not_analyzed'索引

时间:2016-01-30 13:47:13

标签: ruby-on-rails-4 elasticsearch elasticsearch-rails elasticsearch-model

我无法弄清楚为什么elasticsearch没有使用not_analysed索引进行搜索。我的模型中有以下设置,

settings index: { number_of_shards: 1 } do
      mappings dynamic: 'false' do
        indexes :id
        indexes :name, index: 'not_analyzed'
        indexes :email, index: 'not_analyzed'
        indexes :contact_number
      end
    end

    def as_indexed_json(options = {})
      as_json(only: [ :id, :name, :username, :user_type, :is_verified, :email, :contact_number ])
    end

我在elasticsearch上的映射是正确的,如下所示。

{
  "users-development" : {
    "mappings" : {
      "user" : {
        "dynamic" : "false",
        "properties" : {
          "contact_number" : {
            "type" : "string"
          },
          "email" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "id" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string",
            "index" : "not_analyzed"
          }
        }
      }
    }
  }
}

但问题是,当我搜索未分析的字段(名称和电子邮件,因为我希望它们不被分析)时,它只搜索完整的单词。就像下面的例子一样,它应该返回John,Johny和Tiger,所有3条记录。但它只返回2条记录。

我正在搜索如下

  settings = {
    query: {
      filtered: {
        filter: {
          bool: {
            must: [
              { terms: { name: [ "john", "tiger" ] } },
            ]
          }
        }
      }
    },
    size: 10
  }

  User.__elasticsearch__.search(settings).records

这就是我在回调after_save

中为我的用户对象创建索引的方法
User.__elasticsearch__.client.indices.create(
                index: User.index_name,
                id: self.id,
                body: self.as_indexed_json,
              )

一些应该匹配的文件

[{
      "_index" : "users-development",
      "_type" : "user",
      "_id" : "670",
      "_score" : 1.0,
      "_source":{"id":670,"email":"john@monkeyofdoom.com","name":"john baba","contact_number":null}
    },
    {
          "_index" : "users-development",
          "_type" : "user",
          "_id" : "671",
          "_score" : 1.0,
          "_source":{"id":671,"email":"human@monkeyofdoom.com","name":"Johny Rocket","contact_number":null}
        }

    , {
          "_index" : "users-development",
          "_type" : "user",
          "_id" : "736",
          "_score" : 1.0,
          "_source":{"id":736,"email":"tiger@monkeyofdoom.com","name":"tiger sherof", "contact_number":null}
        } ]

请提出任何建议。

2 个答案:

答案 0 :(得分:1)

我认为,keyword toknizerlowercase filter相结合,而非使用not_analyzed,您会得到理想的结果。

john* Johny 不匹配的原因是由于区分大小写。 此设置将起作用

{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "keyword"
        }
      }
    }
  },
  "mappings": {
    "my_type": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "keyword_analyzer"
        }
      }
    }
  }
}

现在john *将匹配johny。如果您有各种要求,则应使用multi-fields john terms query不会给你 john baba 作为内部倒置索引,没有令牌作为 john 。您可以在一个字段上使用标准分析器,在另一个字段上使用关键字分析器。

答案 1 :(得分:0)

根据文档term query

  

术语查询查找包含倒排索引中指定的确切术语的文档。

您正在搜索john,但您的所有文档都没有john,但为什么您没有得到任何结果。您可以使用analysed字段然后应用query string或搜索确切的字词。

有关详细信息,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/2.x/query-dsl-term-query.html