我目前从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"
}
}
但是,没有结果返回。
我在这里阅读了建议:Searching for exact phrase
我需要使用双引号。我已经尝试过“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的一部分)。
How to make query_string search exact phrase in ElasticSearch讨论是否要使用完全匹配的分析器?
更新: 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:atb150538080520172172452]。
最佳答案
您对分析仪的了解是正确的。如果查看类型映射,则属性MESSAGE
可能会标记为analyzed
。这就是为什么在建立索引时会摆脱特殊字符的原因。您需要将其标记为not_analyzed
。
如果您让我们知道您的类型映射是什么样的,我可以为您提供正确的设置。
示例之一-
如果您的ES版本小于5.0,并且类型映射与此类似,则-
{
"MESSAGE": {
"type" "string",
"index": "analyzed"
}
}
更改为
{
"MESSAGE": {
"type" "string",
"index": "not_analyzed"
}
}
关于elasticsearch - 使用Elasticsearch搜索确切的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441350/