搜索Elasticsearch

问题描述

我创建documents类型的_doc索引。然后我 设置自定义分析器,如下所述

POST /documents/_close
PUT /documents/_settings
{
    "settings": {
        "analysis": {
            "analyzer": {
                "custom_analyzer": {
                    "type": "custom","tokenizer": "standard","filter": [
                        "lowercase","word_delimiter_graph"
                    ]
                }
            }
        }
    },"mappings": {
        "properties": {
            "question": {
                "type": "text","analyzer": "custom_analyzer"
            },"question_group": {
                "type": "text","analyzer": "custom_analyzer"
            }
        }
    }
}
POST /documents/_open

我尝试使用此custom_analyzer,然后就可以使用

POST http://localhost:9200/documents/_analyze
{
  "analyzer": "custom_analyzer","text": "FIRE_DETECTED"
}
# And the result (lowercase and remove _ )
{
    "tokens": [
        {
            "token": "fire","start_offset": 0,"end_offset": 4,"type": "<ALPHANUM>","position": 0
        },{
            "token": "detected","start_offset": 5,"end_offset": 13,"position": 1
        }
    ]
}

但是当我尝试搜索“火灾”或“检测到火灾”时,不起作用

当我尝试搜索“检测到火灾”时,它仍然有效 (我为“ FIRE_DETECTED”编制了索引)

#This POST found nothing
POST /documents/_search
{
    "query": {
        "multi_match": {
            "query": "fire detected","fields": [
                "question^2","question_group"
            ]
        }
    }
}

解决方

尝试使用新设置(上方)创建新索引

PUT /documents5
{
    "settings": {...}
}

索引数据

PUT http://localhost:9200/documents5/_doc/1
{
  "question": "fire_detected"
}

搜索

解决方法

发生这种情况的原因是,您只是将custom_analyzer的定义添加到索引中,但没有对数据(索引中的文档)重新索引,因此新的令牌不存在于反向索引中。 要解决此问题,只需重新为要包含在搜索结果中的文档重新编制索引。

您正在使用内部使用multi_match查询的match查询,并且对这些查询进行了分析,因此您不需要搜索时间分析器。

match查询使用在字段上定义的同一分析器来创建搜索令牌(即,根据搜索词创建的)。

match query official docs

返回与提供的文本,数字,日期或布尔值匹配的文档 值。 在匹配之前对提供的文本进行分析。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...