在ElasticSearch中引入字符串部分时出现问题

2wnc66cl  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(2)|浏览(130)

我在ElasticSearch中获取字符串部分时遇到问题。下面是索引的配置。

PUT exemplo
{
    "settings": {
    "analysis": {
      "analyzer": {
        "portuguese_br": {
          "type": "portuguese"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "content": {
        "type": "text",
        "analyzer": "portuguese_br"
      }
    }
  }
}

索引“样本”中有一个包含以下内容的文档:

h2 style margin 0 0 8px font size 16px color 064a7a 1 Síntese Resumo Descrição do cliente h2 div id headertipodocumento1 style min height 40px position relative class editable mce content body contenteditable true spellcheck false p eu encaminho uma Carta ao ReI

我无法通过以下请求获取文档:

GET exemplo/_search
{
  "from": 0,
  "size": 1,
  "query": {
    "bool": {
      "must": [
        {"regexp": {"content": ".*caminho.*"}}
      ]
    }
  }
}

有一部分内容有“encaminho”这个词。我正在搜索“caminho”,但没有得到任何结果。
我在正则表达式中做错了什么吗?

irlmq6kh

irlmq6kh1#

要了解Elasticsearch如何分析您的文本,您可以使用以下API。

GET exemplo/_analyze
{
"text": ["h2 style margin 0 0 8px font size 16px color 064a7a 1 Síntese 
  Resumo Descrição do cliente h2 div id headertipodocumento1 style min 
  height 40px position relative class editable mce content body 
  contenteditable true spellcheck false p eu encaminho uma Carta ao ReI"],
"analyzer": "portuguese_br"
}

encaminho部分的输出如下所示:

{
  "token" : "encaminh",
  "start_offset" : 236,
  "end_offset" : 245,
  "type" : "<ALPHANUM>",
  "position" : 38
},
{
  "token" : "cart",
  "start_offset" : 250,
  "end_offset" : 255,
  "type" : "<ALPHANUM>",
  "position" : 40
},
{
  "token" : "rei",
  "start_offset" : 259,
  "end_offset" : 262,
  "type" : "<ALPHANUM>",
  "position" : 42
}

在分析器将encaminho文本转换为encaminh后,当您搜索caminho时,它与encaminh不匹配。您可以做什么?
1.您可以在编制索引时进行搜索(查看其他注解)
1.您可以将ngram analyzer功能添加到现有分析器中
1.您可以在搜索过程中使用模糊查询
其他注意事项:数据分析是在编制索引期间执行的。但在查询期间不会分析数据,因为您使用的是通配符(regex)查询。如果您可以使用match或multi_match,则您的查询将匹配。此外,匹配查询比通配符查询快。

GET exemplo/_search
{
  "from": 0,
  "query": {
    "match": {
      "content": "encaminho"
    }
  }
}
9o685dep

9o685dep2#

在字段内容中为术语“encaminhado”生成的标记为“encaminh”。尝试按术语“.caminho.”搜索时,没有匹配项。
如果您尝试使用{“regexp”:{【内容】:“.caminh."}}您可以获得文档。
另一个选项是模糊性。就像下面这个查询:

{
      "match": {
        "content": {
          "query": "caminho",
          "fuzziness": "AUTO"
        }
      }
    }

这样你也会得到结果。

相关问题