elasticsearch - 需要知道如何在elasticsearch中搜索同一字段中的多个关键字
问题描述
我正在努力在同一字段中搜索多个关键字。我发现了通配符查询,但它需要很长时间或有时会使我的服务器崩溃。
消息:嗨 abc,您的代码是 56712386
{ "query": { "wildcard": { "message" : "*abc*123" } } }
我需要一些能立即产生结果而不浪费时间或利用完整资源的东西。
解决方案
您正在寻找两件事。
- 只搜索单词的一部分
- 搜索多个单词
在我继续解释它是如何完成的之前,您可能想了解 elasticsearch 在内部是如何工作的。
Elasticsearch 会将(字段的)句子分解为标记并将这些标记存储在倒排索引中。这个过程称为分析。
所以现在无论你有什么查询,它只有在你正在搜索的标记在倒排索引中可用时才有效。
基本上,这一切都归结为倒排索引中存储了哪些令牌。
现在从实现的角度来看,Elasticsearch使用分析器实现了分析的概念。我建议您开始阅读链接以更好地理解。
为了简单起见,我只提一下,为了搜索单词的一部分,您可能希望使用NGram Tokens are 创建一个自定义分析器。
我已经提到了该链接,以便您可以参考它来了解它是什么。
对于您在问题中提到的文档,我创建了一个示例映射和查询以获取您要查找的内容:
映射:
PUT myindex
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 4,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"message":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
样本文件:
POST myindex/_doc/1
{
"message": "Hi abc, your code is 56712386"
}
查询请求:
POST myindex/_search
{
"query": {
"query_string": {
"default_field": "message",
"query": "abc AND 123"
}
}
}
POST myindex/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "abc"
}
},
{
"match": {
"message": "123"
}
}
]
}
}
}
请注意我是如何使用上述查询的。在查询字符串中,您可以使用 bool 运算符搜索多个单词AND
,OR
而在 Bool 查询中,您可以使用must
andshould
这就像逻辑 AND 和逻辑 OR。
希望这可以帮助!
推荐阅读
- docker - Javascript child_process.spawn docker错误
- python - 查找另一个列表中每个子列表的超集索引
- bash - `docker-machine ls` 命令根据我使用的外壳显示不同的输出?
- javascript - 将 webcam.js 数据发送到 python 服务器
- json - 如何将一列StringType(json字符串)转换为一个StructType数组
- java - 动态绑定关注点
- java - 在主类中更改 Spring Boot 日志记录文件
- yocto - Get description of packages in yocto image
- java - Generate swagger JSON file at compile time for springfox based project
- angular - I want to change text 'Hello' to green after 1 hour time interval red to after 2 hour time interval using angular 5