我无法弄清楚为什么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}
} ]
请提出任何建议。
答案 0 :(得分:1)
我认为,keyword toknizer与lowercase 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