我遇到了elasticsearch以及数据索引/检索方式的问题。我不明白会发生什么。
这是我使用的映射(抱歉,它是yaml格式): 这个想法很简单,理论上......我有一个带小写和asciifolding过滤器的字符串分析器。我不想关心案例或口音,我想用这个分析器进行索引和搜索。
settings:
index:
analysis:
filter:
autocomplete_filter:
type: edgeNGram
side: front
min_gram: 1
max_gram: 20
analyzer:
autocomplete:
type: custom
tokenizer: standard
filter: [lowercase, asciifolding, autocomplete_filter]
string_analyzer:
type: custom
tokenizer: standard
filter: [lowercase, asciifolding]
types:
city:
mappings:
cityName:
type: string
analyzer: string_analyzer
search_analyzer: string_analyzer
location: {type: geo_point}
当我运行此查询时:
{
"query": {
"prefix":{
"cityName":"per"
}
}
,
"size":20
}
我得到一些结果,如“Perpezat”,“Pern”,“Péreuil”,这是例外结果。
但如果我运行以下查询:
{
"query": {
"prefix":{
"cityName":"pér"
}
}
,
"size":20
}
然后我根本没有结果。
如果您有任何线索或帮助,我很乐意知道。 感谢
答案 0 :(得分:0)
在Prefix Query中,您的搜索输入不会像其他情况一样进行分析:
匹配包含具有指定前缀的字词的字段(未分析)
您的第一个示例有效,因为文档是在索引时使用您的分析器使用小写和asciifolding进行分析的,因此它们包含一个以per
开头的术语(perpezat
,pern
,{{ 1}})。
您的第二个示例不起作用,因为这些文档不包含以pereuil
开头的任何字词。
由于我无法在执行搜索之前找到告诉Elasticsearch分析前缀的方法,因此您可以通过手动添加此步骤来实现目标:
pér
)作为前缀查询为了实现这一目标,您的搜索输入应该是单个术语(我认为这可能是Elasticsearch首先不想分析它的原因)
答案 1 :(得分:0)
@ mario-trucco最后,我发现这篇文章解释了分析字符串的更好方法。
What is an effective way to search world-wide location names with ElasticSearch?
当然它没有回答我最初的问题,但我仍然不了解发生了什么,但它解决了我的问题。
再次感谢您的帮助和时间。