您的位置:

详解ES模糊查询

一、ES模糊查询语句

1、什么是ES模糊查询语句?

ES模糊查询是基于全文检索引擎Lucene的,使用Lucene提供的模糊匹配查询方法实现。ES模糊查询语句的关键字是wildcard,用于匹配包含通配符的词语。

2、ES模糊查询语句的格式

{
    "query":{
        "wildcard":{
            "fieldname":"*querystring*"
        }
    }
}

其中,fieldname是需要查询的字段名,querystring是需要匹配的字符串。

3、ES模糊查询语句示例

{
    "query":{
        "wildcard":{
            "name":"*elasticsearch*"
        }
   }
}

以上示例查询name字段中包含“elasticsearch”的文档。

二、ES模糊查询不支持中文吗

1、ES模糊查询不支持中文,为什么?

ES模糊查询是基于全文检索引擎Lucene的,而Lucene是基于词条的匹配方式。中文语言缺少空格,没有明显的分词规则可依循,所以无法提供准确的词条。

2、如何在ES中实现中文模糊查询?

可以使用中文分词工具将中文文本进行分词,并使用分词后的词条进行模糊查询。ES中常用的中文分词工具有ik、ansj等。

三、ES模糊查询原理

ES模糊查询的原理是使用Lucene提供的通配符查询,在通配符中使用“*”代表匹配任意数量的字符,使用“?”代表匹配单个字符。

ES模糊查询也可以使用多个通配符组合,比如“he*o?”能够匹配“hello”。

四、ES模糊查询查询不到

1、ES模糊查询查询不到是什么原因?

ES模糊查询需要建立索引才能进行查询,如果索引中没有对应的文档就无法查询到。

2、如何解决ES模糊查询查询不到的问题?

可以使用ES提供的数据导入工具,将需要查询的数据导入到ES中,再建立索引即可。

五、ES模糊查询语法

1、ES模糊查询语法常用关键字

  • *:匹配任意数量的字符
  • ?:匹配单个字符
  • []:匹配括号内的任意一个字符
  • {}:匹配括号内的任意一个词语

2、ES模糊查询语法示例

{
    "query":{
        "wildcard":{
            "text":"a*e"
        }
    }
}

以上示例匹配text字段中以“a”开头,以“e”结尾,中间可以有任意字符的文档。

六、ES模糊查询不生效

1、ES模糊查询不生效是什么原因?

ES模糊查询需要在建立索引时指定对应字段的分词器(analyzer)。如果使用的分词器是不支持通配符的,则ES模糊查询不生效。

2、如何解决ES模糊查询不生效问题?

需要使用支持通配符的分词器,比如standard、keyword等。

七、ES模糊查询失效

1、ES模糊查询失效的原因是什么?

ES模糊查询的通配符匹配是在词条级别上进行的,所以对于过长的词条会使模糊查询失效。比如一个超过20个字符的查询词条就不能成功匹配。

2、如何避免ES模糊查询失效?

应该尽量让词条长度不要过长,可以使用分词工具将词条分割成多个词条,再进行模糊查询。

八、ES模糊查询索引

1、ES模糊查询索引是什么?

ES模糊查询需要在建立索引时指定对应字段的分词器(analyzer),使用支持通配符的分词器后才能进行模糊查询。

2、如何在ES中建立支持模糊查询的索引?

可以在创建index时指定对应字段的analyzer,比如以下示例使用standard分词器:

PUT /my_index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "filter": ["lowercase"]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

九、ES模糊查询1000条

1、ES返回最大的查询结果是有限制的,一般默认情况下是10000条,怎么办?

可以通过修改index的max_result_window参数,调整返回的最大结果数。

2、如何在ES中查询1000条数据?

可以通过添加size参数,指定需要返回的最大结果数。

{
    "query":{
        "wildcard":{
            "name":"*elasticsearch*"
        }
   },
   "size": 1000
}

十、ES模糊查询索引名选取

1、ES模糊查询中索引名的选择对查询性能有影响吗?

是的,索引名称的选择对查询性能有影响,因为不同的索引名称会分配到不同的分片上进行查询。

2、如何在ES中选择合适的索引名称?

应该选择合适的分片策略,将数据在分片之间平均分配,比如可以使用hash算法或者time-based indexing。

结束语

本文对ES模糊查询从语句、原理、语法、索引等多个层面进行了详细的阐述,并提供了相应的解决方法。希望对大家了解ES模糊查询有所帮助。