【发布时间】:2016-10-07 16:05:01
【问题描述】:
我正在使用 elasticsearch-model gem 构建 Rails 网络应用程序。我想为我的 Place 模型构建带有过滤功能的搜索查询。我成功地按名称进行搜索,但是我希望能够使用城市(在本例中为伦敦)过滤我的搜索。
目前我的查询如下所示:
"query": {
"bool": {
"must": {
"match": {
"name": {
"query": term,
"operator": "and",
"fuzziness": 1
}
}
},
"filter": {
"term": {
"city": "London"
}
}
}
}
比我简单地调用Place.search("here goes query").records.to_a
没有过滤器部分搜索工作正常,但是当我添加过滤器时,我没有得到任何结果。
这是地方搜索的映射:
settings analysis: {
filter: {
ngram_filter: {
type: "nGram",
min_gram: 2,
max_gram: 20
}
},
analyzer: {
ngram_analyzer: {
type: "custom",
tokenizer: "standard",
filter: [
"lowercase",
"asciifolding",
"ngram_filter"
]
},
whitespace_analyzer: {
type: "custom",
tokenizer: "whitespace",
filter: [
"lowercase",
"asciifolding"
]
}
}
} do
mappings dynamic: 'false' do
indexes :name,
type: "string",
analyzer: "ngram_analyzer",
search_analyzer: "whitespace_analyzer"
这是我用来查看如何过滤的链接:Elasticsearch doc
【问题讨论】:
-
一个常见的陷阱是,数据会根据现有的分词器分解为 Elastic Search 所谓的“令牌”,并且过滤器必须匹配它们创建的令牌,而不是最初索引的数据。例如,在索引值为“AD-13”的字段后,我得到了“ad”和“13”的标记,因此“AD-13”没有产生任何结果。
-
我认为我修正了一点,我添加了
indexes :city, type: "string"。但是它只适用于由单个单词组成的小写城市我认为我必须使用分析器来修复它。 -
分析仪绝对是问题所在。您可以指定不分析字段,这是我所做的,以避免将带有空格的值分解为单独的标记,从而使它们搜索不正确。
标签: ruby-on-rails elasticsearch elasticsearch-rails