繁体   English   中英

使用Elasticsearch搜索确切的短语

[英]Search for exact phrase with Elasticsearch

我目前从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"}
    }
}'

我试图像这样添加“和”运算符:

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

              }
            }

但是,没有结果返回。 我在这里阅读了建议: 搜索需要使用双引号的确切短语 我已经尝试过“ query”:“'UNH + 66304 + CODECO'”和“ query”:“ \\” UNH + 66304 + CODECO \\“”,但这并没有什么不同。

我也尝试过match_phrase

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

              }
            }

在不返回结果的同时

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

              }
            }

做。 对于普通文本,它似乎可以工作,但是以某种方式,Elasticsearch不喜欢在搜索字符串中使用+:等(不幸的是,它是EDIFACT的一部分)。

如果要精确匹配,如何在ElasticSearch中使query_string搜索精确短语谈论使用其他分析器?

更新: abhishek mishra确认分析仪可能是解决方法。 我正在使用Elasticsearch 5.4,有很多分析器可供选择: https : //www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html

关键字分析器可能会映射到abhishek建议的“未分析”内容,因为它是noop Analyser。 但是我有点担心使用此消息,因为消息可能很长。 搜索对性能有何影响? 如果我使用关键字分析器,仍然可以搜索整个消息的一部分吗?

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

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

因此,上面的示例将分为两个部分。 如果我使用将这些段分开的模式,那会很好吗?

唯一的问题是,当前的MESSAGE字段可以包含EDIFACT消息和XML消息。 我想使用相同的模式分析器将无法正常工作,因此我将不得不根据MESSAGE字段的内容创建两种不同的类型(其余全部相同)。

第2次更新:我已按照建议调查分析仪。 我认为关键字分析器可能不是一个好主意,因为文本可能会很长。 我发现模式分析器(没有任何自定义模式)可以很好地工作。 它拆分了:和+上的所有内容。 搜索类似

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

要么

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

在工作,在忙。 以前的问题是例如将其拆分为[rff,abt:atb150538080520172452]。

您对分析仪的了解是正确的。 如果查看类型映射,则属性MESSAGE可能会标记为analyzed 这就是为什么在建立索引时会摆脱特殊字符的原因。 您需要将其标记为not_analyzed

如果您让我们知道您的类型映射是什么样的,我可以为您提供正确的设置。

示例之一-

如果您的ES版本低于5.0,并且类型映射与此类似,则-

{

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

更改为

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

解决方案是使用模式分析器。 无需进一步配置它(未指定自定义模式),它就将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"
}'

如果您只想测试使用的令牌生成器,则可以用令牌生成器替换“分析器”。

我认为您的“查询”和“ match_phrase”倒置了:

您可以这样尝试吗:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM