我目前正在使用这个Elasticsearch DSL查询:
{
"_source": [
"title",
"bench",
"id_",
"court",
"date"
],
"size": 15,
"from": 0,
"query": {
"bool": {
"must": {
"multi_match": {
"query": "i r coelho",
"fields": [
"title",
"content"
]
}
},
"filter": [],
"should": {
"multi_match": {
"query": "i r coelho",
"fields": [
"title.standard^16",
"content.standard"
]
}
}
}
},
"highlight": {
"pre_tags": [
"<tag1>"
],
"post_tags": [
"</tag1>"
],
"fields": {
"content": {}
}
}
}
这是正在发生的事情。如果我搜索
I.r coelho
,它将返回正确的结果。但是,如果我搜索I R coelho
(无句点),则返回不同的结果。如何防止这种情况发生?我希望搜索的行为相同,即使有多余的句点,空格,逗号等也是如此。制图
{
"courts_2": {
"mappings": {
"properties": {
"author": {
"type": "text",
"analyzer": "my_analyzer"
},
"bench": {
"type": "text",
"analyzer": "my_analyzer"
},
"citation": {
"type": "text"
},
"content": {
"type": "text",
"fields": {
"standard": {
"type": "text"
}
},
"analyzer": "my_analyzer"
},
"court": {
"type": "text"
},
"date": {
"type": "text"
},
"id_": {
"type": "text"
},
"title": {
"type": "text",
"fields": {
"standard": {
"type": "text"
}
},
"analyzer": "my_analyzer"
},
"verdict": {
"type": "text"
}
}
}
}
}
设定:
{
"courts_2": {
"settings": {
"index": {
"highlight": {
"max_analyzed_offset": "19000000"
},
"number_of_shards": "5",
"provided_name": "courts_2",
"creation_date": "1581094116992",
"analysis": {
"filter": {
"my_metaphone": {
"replace": "true",
"type": "phonetic",
"encoder": "metaphone"
}
},
"analyzer": {
"my_analyzer": {
"filter": [
"lowercase",
"my_metaphone"
],
"tokenizer": "standard"
}
}
},
"number_of_replicas": "1",
"uuid": "MZSecLIVQy6jiI6YmqOGLg",
"version": {
"created": "7010199"
}
}
}
}
}
编辑
这是
I.R coelho
中的my analyzer
的结果-{ "tokens": [ { "token": "IR", "start_offset": 0, "end_offset": 3, "type": "<ALPHANUM>", "position": 0 }, { "token": "KLH", "start_offset": 4, "end_offset": 10, "type": "<ALPHANUM>", "position": 1 } ]}
标准分析仪:
{
"tokens": [
{
"token": "i.r",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "coelho",
"start_offset": 4,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}
最佳答案
搜索I.r coelho
和I R coelho
时会有不同的行为的原因是,您在同一字段上使用了不同的分析器,即my_analyzer
和title
(content
块)为must
,而standard
和title.standard
(content.standard
)为should
(默认)。块)。
这两个分析器生成不同的 token ,从而在您搜索I.r coelho
(例如,使用标准分析器的2个 token )或I R coelho
(例如,使用标准分析器的3个 token )时确定不同的分数。您可以使用analyze
API(请参阅Elastic Documentation)来测试分析仪的行为。
您必须确定这是否是您想要的行为。
更新(在OP要求澄清后)_analyze
查询的结果证实了这一假设:两个分析器导致不同的分数贡献,随后,根据查询是否包含符号字符,得出不同的结果。
如果您不希望查询结果受点或大写/小写字母等符号的影响,则需要重新考虑要应用的分析器。当前使用的将永远无法满足您的要求。如果我正确理解了您的需求,那么 simple
built-in analyzer应该是您的用例的正确选择。
简而言之,(1)您应考虑将standard
内置分析器替换为simple
一个,(2)您应决定是否要让您的查询根据不同的分析器对匹配应用不同的得分(例如,语音在title
和content
字段的值上自定义一个,在其各自的子字段上定制simple
一个)。
关于elasticsearch - 如何使 Elasticsearch 更灵活?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60189958/