我现在从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]。
我想你把“查询”和“匹配短语”倒过来了:
你能这样试试吗:
{
"query": {
"match_phrase": {
"MESSAGE": "UNH+66304"
}
}
}
解决方案是使用模式分析仪。无需进一步配置(未指定自定义模式),它会将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"
}'
如果您只想测试所使用的标记器,您可以将“分析器”替换为标记器。
你对分析仪的看法是对的。如果查看类型映射,属性消息
可能被标记为已分析
。这就是为什么在编制索引时要去掉特殊字符。您需要将其标记为未分析
。
如果你让我们知道你的类型映射是什么样子的,我可以帮你做正确的设置。
其中一个例子-
如果你的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 。但是我的