我正在使用Q对象进行弹性查询,并且已经建立了索引文档,其中一个文档包含“ jbl说话者很棒”,但是我的查询中却包含“ speaker”而不是说话者,我该如何使用查询字符串查找此文档。 / p>
我尝试过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')
我希望输出文档包含发言人,但 实际输出是没有包含发言人的文件
答案 0 :(得分:0)
正在寻找索引的搜索类型可以通过在索引编制时使用stemmer token filter来实现。
使用下面的示例映射来了解其工作原理:
Settings > Editor > Color Scheme > Kotlin
对于上面映射中的字段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
,从而找到匹配项。
有关stemming的更多信息。