当前位置: 首页 > 知识库问答 >
问题:

elasticsearch - ElasticSearch通过word_delimiter_graph实现驼峰的分词后搜索结果里没有部分匹配的内容?

蒋航
2023-05-04

复现步骤如下

创建示例索引

创建一个索引,该索引有一个字段content,该字段使用自定义分词器my_custom_analyzer分词,my_custom_analyzer自定义分词器使用word_delimiter_graph过滤器,过滤器配置在custom_word_delimiter_graph_filter字段对应的值里

PUT test_index_demo
{
  "settings": {
    "index": {
        "number_of_shards": "1",
        "number_of_replicas": "0"
    },
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "standard",
          "filter": [
            "custom_word_delimiter_graph_filter",
            "lowercase"
          ]
        }
      },
      "filter": {
        "custom_word_delimiter_graph_filter": {
          "type": "word_delimiter_graph",
          "catenate_all": true,
          "preserve_original": true,
          "stem_english_possessive": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_custom_analyzer"
      }
    }
  }
}

插入两条示例数据

POST test_index_demo/_create/1
{"content":"这是文档1 onVideoDataCallback video 这是 callback"}

POST test_index_demo/_create/2
{"content":"能不能匹配到这里 video callback"}

查看分词结果

GET /test_index_demo/_analyze
{
  "field": "content",
  "text": "OnVideoDataCallback"
}

image.png

使用match query搜索

POST test_index_demo/_search
{
    "from": 0,
    "size": 10,
    "query" : { 
      "match": { 
        "content" : {
          "query": "onVideoDataCallback"
        } 
      }
    },
    "highlight": {
        "fields": {
            "content": {},
            "title": {}
        },
        "fragment_size": 200
    }
}

image.png

image.png

按理说分词是正确的,搜索结果却只包含完整单词的结果,该怎么做才能又包含部分驼峰中单词的结果?

共有1个答案

南宫建白
2023-05-04

先要更改索引设置,为my_custom_analyzer添加edge_ngram过滤器。

PUT test_index_demo
{
  "settings": {
    "index": {
        "number_of_shards": "1",
        "number_of_replicas": "0"
    },
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "standard",
          "filter": [
            "custom_word_delimiter_graph_filter",
            "lowercase",
            "edge_ngram_filter"
          ]
        }
      },
      "filter": {
        "custom_word_delimiter_graph_filter": {
          "type": "word_delimiter_graph",
          "catenate_all": true,
          "preserve_original": true,
          "stem_english_possessive": true
        },
        "edge_ngram_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 50
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_custom_analyzer"
      }
    }
  }
}

再用match查询:

POST test_index_demo/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "match": {
      "content": {
        "query": "onVideoDataCallback"
      }
    }
  },
  "highlight": {
    "fields": {
      "content": {},
      "title": {}
    },
    "fragment_size": 200
  }
}
 类似资料:
  • 问题内容: 我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询: 但是ES查询不适用于此sql查询 在我的elasticsearch以及通配符查询中,我还需要执行一些布尔过滤查询 上面的带有通配符搜索的弹性查询可以很好地工作,并让我获得所有与pete匹配且不是xyz和abc类型的文档。但是当我尝试使用以空格分隔的2个独立单词执行通配符时,相同的查询返回

  • 我有一个带有标准分析器的弹性搜索集群。我知道使用这个分析仪,术语“300”被分析为一种类型。 假设我正在搜索一个具有字段“name”的文档,该字段的值为“纸巾300 CT”,分析为[“Paper”(ALPHANUM)、“tower”(ALPHANUM)、“300”(NUM)、“CT”(ALPHANUM)] 目前,当我使用模糊/通配符查询时,如下所示: 无论模糊性如何调整,模糊查询都不匹配。我希望术

  • 我正在使用ElasticSearch5,找不到以下问题的解决方案:我想在文档中搜索带斜杠的字符串(url的一部分)。但它不会返回匹配的文档。我读过一些东西,带斜线的字符串被ES拆分,这不是我想要的字段。我尝试用映射在字段上设置“not_analysis”,但似乎无法使其工作。 “创建索引”:Put http://localhost:9200/test “添加文档”:post http://loca

  • 问题内容: 我最近开始使用ElasticSearch,但似乎无法让它搜索单词的一部分。 示例:我有我的ouchdb中的三个文档,在ElasticSearch中建立了索引: 所以现在,我要搜索包含“ Doe”的所有文档 那不会返回任何点击。但是如果我寻找 它确实返回一个文档(John Doeman)。 我尝试将不同的分析器和不同的过滤器设置为索引的属性。我也尝试使用完整的查询(例如: ),但似乎没有

  • 假设我有一些文档,在名为“名称”的文本字段中包含以下值 文档1: 文档2: 文档3: 现在,假设我向ES发送一个简单的匹配查询,查询术语“组”: 我期望的结果是,无论术语出现的频率、出现的位置等,所有3个文档都会以相同的分数返回。现在,我已经知道,我可以通过将我的匹配项包装为常量分数来实现这一点,如下所示: 但是,假设我现在想使用搜索词abc组进行查询。在这种情况下,我希望Document2和Do

  • 问题内容: 在索引中,我有一个IP字段。字段的类型为“ ip”。 我想搜索所有以“ 192.168”开头的IP 我所有的尝试都失败了,并显示以下消息: 无法解析IP [192.168],不是有效的IP地址 有没有办法做到这一点,还是应该将字段的类型更改为“字符串”? 谢谢。 问题答案: 您可以使用范围查询,例如: