我们正在运行ElasticSearch,并且在搜索包含空格的术语时遇到一些问题.一个具体的例子:有一个名叫JM Bruno的人,但是在搜索时没有返回任何结果.我隐约记得搜索这个确切的术语确实返回了结果,但我现在无法重现.
我尝试在我的tokenizer模式中添加一个空格和"\",没有太多运气.ES设置如下(在Ruby on Rails应用程序中使用Tire gem)
module Search
def self.included base
base.send :include, Tire::Model::Search
base.send :include, Tire::Model::Callbacks
base.class_eval do
settings analysis: {
filter: {
ngram: {
type: 'nGram',
max_gram: 12,
min_gram: 3
},
url_stop: {
type: "stop",
stopwords: %w[http https]
}
},
tokenizer: {
url_email_tokenizer: {
pattern: '[^\w\-\.@]+',
type: 'pattern'
}
},
analyzer: {
url_analyzer: {
tokenizer: "url_email_tokenizer",
filter: %w[url_stop ngram],
type: "custom"
},
name_analyzer: {
tokenizer: 'url_email_tokenizer',
filter: 'ngram',
type: 'custom'
}
}
}
end
end
end
Run Code Online (Sandbox Code Playgroud)
我们也使用这些标记器来搜索域名和电子邮件地址.
尝试使用您应用于字段的分析器运行_analyze API 。
curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno'
Run Code Online (Sandbox Code Playgroud)
您将看到 Elasticsearch 如何将您的字段内容分解为标记,以及为什么您无法使用 TermQuery 搜索它。TermQuery 不会被分析,因此它会按照原样将您的查询与倒排索引进行比较。
归档时间: |
|
查看次数: |
5023 次 |
最近记录: |