我有一张有 job_title 字段的表,
我想做一个模糊搜索,让用户在拼错查询关键字时仍然可以得到结果。
例如,我有很多记录都有“Android开发者”作为它的job_title,
当用户发出不正确的搜索Job.es_qsearch("Andoirddd")
时,它应该在NGRAM_ANALYZER
但是,我可以从不正确的关键字中得到任何结果。
我只能在输入时得到结果Job.es_qsearch("Android")
我怎样才能达到我期望的搜索结果。
谢谢
工作.rb
NGRAM_ANALYZER = {analysis: {
filter: {
autocomplete_filter: {
type: "edge_ngram",
min_gram: 3,
max_gram: 20
}
},
analyzer: {
ngram_analyzer: {
type: :custom,
tokenizer: :standard,
filter: [
:lowercase,
:autocomplete_filter
]
}
}
}}
settings NGRAM_ANALYZER do
mappings do
indexes :job_title, include_in_all: 'ngram_analyzer'
indexes :description, include_in_all: 'ngram_analyzer'
end
end
def self.es_qsearch(*args, &block)
q_params = {
multi_match: {
query: "*#{args}*",
fields: ['job_title^5', 'description']
}
}
__elasticsearch__.search(
{
query: q_params,
}
)
end
我使用了模糊查询,但它仍然无法正常工作
模糊查询将此查询发送到 ES 搜索
{:index=>"jobs",
:type=>"job",
:body=>{:query=>{:bool=>{:must=>[{:fuzzy=>{:description=>{:value=>["electrical"], :fuzziness=>2}}}]}}, :size=>200}},
模糊查询1:不工作
"bool": {
"must": [
{
"fuzzy": {
"description": {
# min_similarity: 0.4,
"value": args,
# prefix_length: 0,
"fuzziness": 2
}
},
}]
}
模糊查询1:不工作
"fuzzy": {
"description": {
# min_similarity: 0.4,
"value": args,
# prefix_length: 0,
"fuzziness": 2
}
},