Ayu*_*arg 5 django python-3.x elasticsearch
我正在使用 Q 对象进行弹性查询,并且我已索引文档,其中一个文档包含“jbl扬声器很棒”,但我的查询有“扬声器”而不是扬声器,如何使用查询字符串找到该文档。
我尝试过 match_phrase 但无法找到此文档,当我尝试 query_string 时,它抛出一个错误,指出“query_string 不支持某些键”。我也尝试过通配符,但这也不适用于类似的查询
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"prod_group": "06"
}
},
{
"match_phrase": {
"prod_group": "apparel"
}
},
{
"wildcard": {
"prod_cat_for_search": "+speaker*"
}
},
{
"range": {
"date": {
"gte": "2018-04-07"
}
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
Q('match_phrase', prod_cat_for_search='speaker')
Run Code Online (Sandbox Code Playgroud)
我期望输出文档包含扬声器,但实际输出不包含扬声器的文档
您正在寻找的搜索类型可以通过在索引时使用词干标记过滤器来实现。
让我们使用下面的示例映射来看看它是如何工作的:
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"my_stemmer"
],
"tokenizer": "whitespace"
}
},
"filter": {
"my_stemmer": {
"type": "stemmer",
"name": "english"
}
}
}
},
"mappings": {
"doc": {
"properties": {
"description": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面映射中的字段,description我们使用分析器作为my_analyzer。该分析器将应用令牌过滤器lowercase和my_stemmer. 将对输入值my_stemmer应用词干提取。english
例如,如果我们按如下方式索引文档:
{
"description": "JBL speakers build with perfection"
}
Run Code Online (Sandbox Code Playgroud)
将被索引的令牌是:
jbl
speaker
build
with
perfect
Run Code Online (Sandbox Code Playgroud)
通知speakers索引为speaker和perfectionas perfect。
现在,如果您搜索speakers或speaker两者都会匹配。同样,如果你搜索perfect上面的文档也会匹配。
为什么speakers或perfection将匹配可能是您脑海中浮现的一个问题。原因是默认情况下,弹性搜索也会应用搜索时索引时使用的相同分析器。因此,如果您搜索,perfection它实际上会搜索perfect并因此匹配。
有关词干的更多信息。
| 归档时间: |
|
| 查看次数: |
3421 次 |
| 最近记录: |