我无法弄清楚为什么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":"[email protected]","name":"john baba","contact_number":null}
    },
    {
          "_index" : "users-development",
          "_type" : "user",
          "_id" : "671",
          "_score" : 1.0,
          "_source":{"id":671,"email":"[email protected]","name":"Johny Rocket","contact_number":null}
        }

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

有任何建议请。

最佳答案

我认为您将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这样的 token 。您可以在一个字段上使用标准分析器,而在另一字段上使用关键字分析器。

关于ruby-on-rails-4 - Elasticsearch无法使用 'not_analyzed'索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35102540/

10-15 23:37