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

使用Elasticsearch搜索精确短语

臧曜瑞
2023-03-14

我现在从Elasticsearch开始。我为一些EDIFACT消息(一种史前数据格式;-)编制了索引,内容如下:

UNB+UNOA:2+SENDER+RECEIVER+170509:0050+152538'
UNH+66304+CODECO:D:95B:UN:ITG12'
BGM+34+INGATE OF UCN ABCD+9'

当我搜索短语UNH 66304 CODECO: D:95B时,它应该只返回一次命中,但它似乎返回了包含任何这些单词的所有文件(并且UNH在每个文档中)。我的查询是:

curl -XGET --netrc-file ~/curl_user  'localhost:9200/edi/message/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "query":{
        "match":{"MESSAGE":"UNH+66304+CODECO:D:95B"}
    }
}'

我尝试添加“and”操作符,如下所示:

"match":{
              "MESSAGE":{
                "query":"UNH+66304+CODECO",
                "operator": "and"

              }
            }

但是没有返回结果。我在这里读到了建议:搜索需要使用双引号的确切短语。我试过“查询”:“UNH 66304 CODECO”和“查询”:“UNH 66304 CODECO”,但都没用。

我也试过匹配这个短语

"match_phrase":{
              "MESSAGE":{
                "query":"UNH+66304+CODECO"

              }
            }

而不返回结果

"match_phrase":{
              "MESSAGE":{
                "query":"UNH+66304"

              }
            }

确实。对于普通文本,它似乎可以工作,但不知何故Elasticsearch不喜欢搜索字符串中的: etc(不幸的是,这是EDIFACT的一部分)。

如何在ElasticSearch中使查询字符串搜索精确短语如果你想要精确匹配,可以使用不同的分析器?

更新:abhishek mishra确认Analyser可能是要走的路。我正在使用Elasticsearch 5.4,有很多Analyser可供选择:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html

关键词分析器可能会映射到阿披实建议的“未分析”,因为它是一个noop分析器。然而,我有点担心使用它,因为消息可能会很长。搜索的性能影响是什么?如果我使用关键字分析器,我还能搜索整条消息的部分内容吗?

我想知道模式分析器是否适合?EDIFACT消息由以3个大写字符开头的段组成,结尾为“(但您可以通过在其前面加?)来转义”)

FTX+AAA++It?'s a strange data format'
FTX+AAA++Yes it is'

所以上面的例子是两个片段。如果我使用一个模式来分隔这些片段,那会是一个很好的匹配吗?

唯一的问题是,当前消息字段可以包含EDIFACT消息和XML消息。我想使用相同的模式分析器是行不通的,所以我必须根据消息字段的内容创建两种不同的类型(其余的都是相同的)。

第二次更新:我按照建议查看分析仪。我认为关键字分析器可能不是个好主意,因为文本可能很长。我发现模式分析器(没有任何自定义模式)工作得非常好。它把一切都分开了:和。搜索像

{
    "query":{
        "match_phrase":{"MESSAGE":"RFF+ABT:ATB150538080520172452"}
    }
}

{
        "query":{
            "match_phrase":{"MESSAGE":"RFF+ABT:ATB150538080520172452"}
        }
    }

现在工作。之前的问题是,例如被拆分为[rff, abt: atb150538080520172452]。

共有3个答案

樊熠彤
2023-03-14

我想你把“查询”和“匹配短语”倒过来了:

你能这样试试吗:

{
    "query": {
        "match_phrase": {
            "MESSAGE": "UNH+66304"
        }
    }
}
陈翰林
2023-03-14

解决方案是使用模式分析仪。无需进一步配置(未指定自定义模式),它会将EDIFACT消息按非单词/数字字符分隔。

标准分析仪的问题是,它在“:”中的行为很奇怪。所以如果你有RFF ATB:AB12345;它将其拆分为[rff,atb:ab12345],因此对ab12345的搜索没有返回任何内容。

您可以使用以下命令测试分析器或标记器的工作原理

curl -XPOST --netrc-file ~/curl_user 'localhost:9200/_analyze?pretty' -H 'Content-Type: application/json' -d'
{
  "analyzer": "standard",
  "text":      "UNB+UNOA:2+SENDER+RECEIVER+170513:0452+129910165"
}'

如果您只想测试所使用的标记器,您可以将“分析器”替换为标记器。

颛孙英才
2023-03-14

你对分析仪的看法是对的。如果查看类型映射,属性消息可能被标记为分析。这就是为什么在编制索引时要去掉特殊字符。您需要将其标记为未分析

如果你让我们知道你的类型映射是什么样子的,我可以帮你做正确的设置。

其中一个例子-

如果你的ES版本是

{

  "MESSAGE": {
    "type" "string",
    "index": "analyzed"
  }
}

换成

{
  "MESSAGE": {
    "type" "string",
    "index": "not_analyzed"
  }
}
 类似资料:
  • 问题内容: 我在Elasticsearch中放了2个文档: 为什么此查询返回2个文档: 而这个,只有第二个文件: 我想elasticsearch以匹配我传递给查询参数的确切词组(带空格),该怎么做? 问题答案: 您需要查看的是正在使用的分析仪。如果您未指定,Elasticsearch将使用标准分析器。在大多数使用纯文本输入的情况下,它非常有用,但不适用于您提到的用例。 标准分析器将执行的操作是将字

  • 我在Elasticsearch中放置了两个文档: 为什么此查询返回2个文档: 而这一个,只有第二个文件: 我希望弹性搜索能够匹配我传递给查询参数的确切短语,带有空格,我该怎么做?

  • 问题内容: 我想在文档中搜索“社交网络营销”。全部一起。但是我继续得到结果,单词分开。我有以下DSL查询: 我没有包含此短语和标题的文档,但是我也得到了包含短语单词的搜索结果(文档)以进行拆分。我要严格搜索。如果没有任何文档使用此短语,则不要检索任何文档或仅检索具有该标题的文档。为什么 运算符又 不起作用? 问题答案: 您可以使用类型词组尝试以下方法吗?看到这里说, 查询首先分析查询字符串以生成术

  • 问题内容: 我正在寻找一种在elasticsearch中进行 精确 数组匹配的方法。假设这些是我的文件: 有没有一种方法可以搜索所有类别 完全相同或完全不同 的“ c”和“ d”文档(文档1和5)? 另外,搜索“其中一个”类别还是应该可行的(例如,您可以搜索“ c”并获得1、2、3和5) 有解决这个问题的聪明方法吗? 问题答案: 如果您有一组离散的已知类别,则可以使用布尔查询: 否则,我认为,可能

  • 我正在使用elasticsearch从json字段进行精确短语匹配。我尝试过多种语法,比如multi_match、query_string query_string我正在使用的语法; 我也尝试了过滤器而不是查询,但是过滤器在json上没有给出任何结果。我用于过滤器的语法是; 现在的问题是; 是否可以使用elasticsearch对json执行精确匹配操作?

  • 问题内容: Elasticsearch版本:7.1.1 嗨,我做了很多尝试,但是在索引中找不到任何解决方案,我有一个包含字符串的字段。 因此,例如,我有两个文档,它们在locations数组中包含不同的值。 文件1: 文件2: 用户请求搜索术语 克洛彭堡, 而我只想返回那些包含术语 克洛彭堡 而不是 Landkreis Cloppenburg的 文档。结果应仅包含 Document-1 。但是我的