我正在使用Elasticsearch 6.2构建cross-fields search。我在弄清楚如何处理我的学期部分匹配时遇到问题。
我的查询:
{
"index":"course",
"type":"course",
"body":{
"query":{
"bool":{
"must":{
"multi_match":{
"query":"macroeconomics",
"fields":[
"course_name",
"course_number",
"university_name"
],
"type":"cross_fields"
}
}
}
},
"sort":[
{
"_score":"desc"
},
{
"students":{
"order":"desc"
}
}
],
"from":0,
"size":50
}
}
在跨场模式下,查询返回的搜索结果与macroeconomics
搜索词完全匹配。
问题是,一旦我将搜索字词更改为macro
,我只会得到macro
字词(完全匹配)的一些结果,而我的预期结果将包括:
macro
项的所有结果(完全匹配),再加上macro
字词的任何结果(作为部分匹配项),例如在
“宏观经济学” 我知道使用通配符会影响性能,所以这不是最佳方法。
如何调整查询以如上所述获得预期结果?这不只是将“宏”当作前缀,而是作为其他结果中可用的潜在子串。
>答案 0 :(得分:0)
基本上,您将需要创建一个自定义分析器。供参考,请检查link
如果您只想尝试一下。 要设置NGram令牌生成器,我们应声明如下:
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
}
“ my_analyzer”是分析器的名称,将用于ngram字段 然后,对于您的映射,您需要将分析仪映射到该字段
"mappings": {
"_doc": {
"properties": {
"course_name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
...
只需将分析器添加到所需的字段
更新 验证您的分析仪
GET yourindexname/_analyze
{
"analyzer": "my_analyzer",
"text": "macroeconomics"
}
我经常看到的另一个是
"min_gram" : "3",
"max_gram" : "8"
但这全取决于您的用例。