0

我无法弄清楚为什么 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}
        } ]

请有任何建议。

4

2 回答 2

1

我认为使用关键字 toknizer结合小写过滤器而不是使用not_analyzed.

与Johnyjohn*不匹配的原因是区分大小写。此设置将起作用

{
  "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如果您有各种要求,您应该使用。terms query因为john不会给你john baba,因为在倒排索引中没有john的标记。您可以在一个字段上使用标准分析器,在另一个字段上使用关键字分析器。

于 2016-01-30T15:17:36.427 回答
0

根据文档term query

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

您正在搜索,john但没有任何文档包含john即为什么您没有得到任何结果。您可以选择您的领域analysed,然后申请query string或搜索确切的术语。

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

于 2016-01-30T15:04:43.083 回答