如何在 Elasticsearch 中找到所有包含“blah”的 objects?
How does one find all objects that contain “blah” in Elasticsearch?
我一直在像这样使用 wildcard:*blah*
但是,文档声明您不应该使用 *
作为通配符值的开头,因为它会增加所需的迭代次数并降低搜索性能。
此外,文档中也没有说明通配符是否打算 case-insensitive。我注意到,当我搜索小写字母“a”时,我得到的是同时包含“a”或“A”的所有内容,但是当我搜索大写字母“A”时,字面意思是 *A*
,我没有返回完全没有结果。
我希望此特定搜索的行为与我使用 filter(title__icontains=‘blah’)
时 Django 的 ORM 的行为完全相同,包括 case-insensitivity。因此,如果我说 get me all records that contain the word ‘the’ in the title
,我希望返回标题中带有“the”(case-insensitive) 的任何内容。
我不知道您将如何绕过使用通配符查询的谨慎方法,所以如果您只是在语法方面遇到问题,那么它看起来应该是这样的:
GET /_search
{
"query": {
"wildcard": {
"title": {
"value": "*elved*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
我刚刚在自己的搜索索引上测试了此类查询,并在产品标题中搜索 *oam*
正确匹配 "foaming"。
至于 case-insensitivity,只要您使用 built-in 之一,就应该处理 out-of-the-box分析器(例如 Standard or English)。但是,如果您使用的是自定义分析器,那么您只需要确保包括 lowercase
过滤器,以及您想要 运行 条款通过的任何其他过滤器。
PUT index_name
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
}
}
}
}
如果您没有在字段映射中指定分析器,那么我相信它默认使用 standard
,其中包括小写过滤。
我一直在像这样使用 wildcard:*blah*
但是,文档声明您不应该使用 *
作为通配符值的开头,因为它会增加所需的迭代次数并降低搜索性能。
此外,文档中也没有说明通配符是否打算 case-insensitive。我注意到,当我搜索小写字母“a”时,我得到的是同时包含“a”或“A”的所有内容,但是当我搜索大写字母“A”时,字面意思是 *A*
,我没有返回完全没有结果。
我希望此特定搜索的行为与我使用 filter(title__icontains=‘blah’)
时 Django 的 ORM 的行为完全相同,包括 case-insensitivity。因此,如果我说 get me all records that contain the word ‘the’ in the title
,我希望返回标题中带有“the”(case-insensitive) 的任何内容。
我不知道您将如何绕过使用通配符查询的谨慎方法,所以如果您只是在语法方面遇到问题,那么它看起来应该是这样的:
GET /_search
{
"query": {
"wildcard": {
"title": {
"value": "*elved*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
我刚刚在自己的搜索索引上测试了此类查询,并在产品标题中搜索 *oam*
正确匹配 "foaming"。
至于 case-insensitivity,只要您使用 built-in 之一,就应该处理 out-of-the-box分析器(例如 Standard or English)。但是,如果您使用的是自定义分析器,那么您只需要确保包括 lowercase
过滤器,以及您想要 运行 条款通过的任何其他过滤器。
PUT index_name
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
}
}
}
}
如果您没有在字段映射中指定分析器,那么我相信它默认使用 standard
,其中包括小写过滤。