首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果查询在引号之间,如何从elasticsearch获得准确的文本匹配

如果查询在引号之间,如何从elasticsearch获得准确的文本匹配
EN

Stack Overflow用户
提问于 2019-11-06 12:27:42
回答 1查看 2.2K关注 0票数 2

我为二进制文档(fscrawler)使用php实现了elasticsearch。它在默认设置中运行得很好。我可以在文档中搜索我想要的单词,并得到不区分大小写的结果。但是,我现在想要进行精确的匹配,即在当前搜索的基础上,如果查询被用引号括起来,我希望得到只与查询完全匹配的结果。甚至区分大小写。

我的地图如下所示:

代码语言:javascript
复制
"settings": {
"number_of_shards": 1,
"index.mapping.total_fields.limit": 2000,
"analysis": {
  "analyzer": {
    "fscrawler_path": {
      "tokenizer": "fscrawler_path"
    }
  },
  "tokenizer": {
    "fscrawler_path": {
      "type": "path_hierarchy"
    }
  }
}
.
.
.
  "content": {
    "type": "text",
    "index": true
  },

我对文档的查询如下所示:

代码语言:javascript
复制
    if ($q2 == '') {
    $params = [
        'index' => 'trial2',
        'body' => [
            'query' => [
                'match_phrase' => [
                        'content' => $q
                ]
            ]
        ]
    ];

    $query = $client->search($params);
    $data['q'] = $q;
}

对于精确匹配(不起作用):

代码语言:javascript
复制
    if ($q2 == '') {
        $params = [
            'index' => 'trial2',
            'body' => [
                'query' => [
                    'filter' =>[
                        'term' => [
                            'content' => $q
                        ]
                    ]
                ]
            ]
        ];

        $query = $client->search($params);
        $data['q'] = $q;
    }

content字段是文档的主体。如何实现内容字段中特定单词或短语的精确匹配?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-07 10:45:23

据我所知,您的content字段将非常大,因为许多文档可能超过2-3 MB,这是一个很大的单词。

使用keyword字段来进行精确匹配是没有意义的,正如前面提到的使用keyword的问题的答案一样。只有在数据是结构化的情况下,才应该使用keyword数据类型进行精确匹配的

我所理解的是,您拥有的content字段是非结构化的。在这种情况下,您可能希望在您的白空间分析仪字段中使用content

同样,要使短语匹配准确,请查看匹配短语查询。

下面是一个示例索引、文档和查询,足以满足您的用例。

制图:

代码语言:javascript
复制
PUT mycontent_index
{
  "mappings": {
    "properties": {
      "content":{
        "type":"text",
        "analyzer": "whitespace"            <----- Note this
      }
    }
  }
}

样本文件:

代码语言:javascript
复制
POST mycontent_index/_doc/1
{
  "content": """
      There is no pain you are receding
      A distant ship smoke on the horizon
      You are only coming through in waves
      Your lips move but I can't hear what you're saying
  """
}

POST mycontent_index/_doc/2
{
  "content": """          
      there is no pain you are receding
      a distant ship smoke on the horizon
      you are only coming through in waves
      your lips move but I can't hear what you're saying
  """
}

短语匹配:(按顺序搜索句子)

代码语言:javascript
复制
POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {                   <---- Note this for phrase match
            "content": "There is no pain"
          }
        }
      ]
    }
  }
}

匹配查询:

代码语言:javascript
复制
POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {                          <---- Use this for token based search
            "content": "there"
          }
        }
      ]
    }
  }
}

请注意,您的答复应该是相应的。

要准确匹配一个单词,只需使用一个简单的匹配查询即可。

注意,当您不指定任何分析器时,ES默认使用标准分析仪,这将导致将所有令牌转换为小写,然后将它们存储在倒排索引中。但是,白空间分析仪不会将令牌转换为小写。因此,Therethere作为两个不同的令牌存储在您的ES索引中。

我假设您知道分析分析器的概念,如果不知道,我建议您浏览这些链接,因为这将帮助您更好地了解我正在谈论的内容。

最新答复:

在了解您的需求后,您无法在单个字段上应用多个分析器,因此基本上您有两个选项:

选项1:使用多个索引

选项2:在映射中使用多场,如下所示:

这样,您的脚本或服务层就会根据输入值将不同的索引或字段推送到不同的索引或字段(具有双倒逗号和简单标记的索引或字段)。

多场测绘:

代码语言:javascript
复制
PUT <your_index_name>
{ 
   "mappings":{ 
      "properties":{ 
         "content":{ 
            "type":"text",                     <--- Field with standard analyzer
            "fields":{ 
               "whitespace":{ 
                  "type":"text",               <--- Field with whitespace
                  "analyzer":"whitespace"       
               }
            }
         }
      }
   }
}

理想情况下,我更希望有第一个解决方案,即使用具有不同映射的多个索引,但是我强烈建议您重新检查用例,因为管理这样的查询没有意义,但这还是您的调用。

备注:是由单个节点组成的集群,这是您所能做的最糟糕的选择,特别是不用于生产。

我建议您在单独的问题中详细说明您的文档数量、未来5年的增长率或其他什么,您的用例是读得更重还是写得更多?这是其他团队可能也希望利用的集群。我建议你阅读更多,并与你的团队或经理讨论,以使你的方案更清晰。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58730188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档