django - 如何在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"
}
}
}
]
}
}
}
Q('match_phrase', prod_cat_for_search='speaker')
我希望输出文档包含扬声器,但实际输出不是包含扬声器的文档
解决方案
您正在寻找的搜索类型可以通过在索引时使用词干过滤器来实现。
让我们看看它是如何使用下面的示例映射工作的:
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"
}
}
}
}
}
}
}
对于description
上述映射中的字段,我们将分析器用作my_analyzer
. 此分析器将应用令牌过滤器lowercase
和my_stemmer
. my_stemmer
将对输入值应用english
词干。
例如,如果我们索引一个文档如下:
{
"description": "JBL speakers build with perfection"
}
将被索引的令牌是:
jbl
speaker
build
with
perfect
通知speakers
被索引为speaker
和。perfection
perfect
现在,如果您搜索speakers
或speaker
两者都会匹配。同样,如果你搜索perfect
上面的文件也会匹配。
为什么speakers
或perfection
将匹配可能是您脑海中浮现的一个问题。这样做的原因是,默认情况下,弹性搜索应用与搜索时索引时使用的分析器相同的分析器。因此,如果您搜索perfection
它将实际搜索perfect
并因此匹配。
更多关于词干。
推荐阅读
- unity3d - 如何在应用程序启动期间只运行一次统一的多个场景
- python - 在循环内的条件语句中返回 vs 打印
- wpf - 滚动条可见时组合框底部的空白区域
- ruby-on-rails-5 - Rails 5:如何在应用程序模板脚本中添加文件夹和文件
- go - 反射类型比较
- ansible - 按多个测试/条件过滤列表
- javascript - IE11 仅在一些随机点击后才显示新添加的元素
- javascript - setState 的 React 语法解释
- javascript - 如何在 NGRX Effects 中正确发送多个 HTTP 请求?
- javascript - 运行反应原生项目时未定义不是函数(评估't.createContext(!1)')