我目前开始使用 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 分析器。但是我有点担心使用它,因为消息可能会很长。搜索对性能有何影响?如果我使用关键字分析器,我仍然可以搜索整条消息的部分内容吗?
我想知道模式分析器是否适合?EDIFACT 消息由以 3 个大写字符开头并以 ' 结尾的段组成(但您可以通过在其前面加上 ? 来转义 ')
FTX+AAA++It?'s a strange data format'
FTX+AAA++Yes it is'
所以上面的例子是两个部分。如果我将使用分隔这些段的模式,那会是一个很好的匹配吗?
唯一的问题是当前 MESSAGE 字段可以包含 EDIFACT 消息和 XML 消息。我猜使用相同的模式分析器是行不通的,所以我必须根据 MESSAGE 字段的内容创建两种不同的类型(其余的都是相同的)。
第二次更新: 我已按照建议研究分析仪。我认为关键字分析器可能不是一个好主意,因为文本可能很长。我发现模式分析器(没有任何自定义模式)工作得很好。它将所有内容拆分为:和+。搜索喜欢
{
"query":{
"match_phrase":{"MESSAGE":"RFF+ABT:ATB150538080520172452"}
}
}
或者
{
"query":{
"match_phrase":{"MESSAGE":"RFF+ABT:ATB150538080520172452"}
}
}
在工作,在忙。之前的问题是 eg 被拆分为 [rff,abt:atb150538080520172452]。