【问题标题】:Elastic search filter弹性搜索过滤器
【发布时间】:2015-08-28 06:24:16
【问题描述】:

我是弹性搜索的新手。请帮助我找到要编写的过滤器/查询以匹配使用 Java API 的确切记录。

Below is the mongodb record .I need to get both the record matching the word 'Jerry' using elastic search.

{
        "searchcontent" : [
                {
                        "key" : "Jerry",
                        "sweight" : "1"
                },{
                        "key" : "Kate",
                        "sweight" : "1"
                },

        ],
        "contentId" : "CON_4",
        "keyword" : "TEST",
        "_id" : ObjectId("55ded619e4b0406bbd901a47")
},
{
        "searchcontent" : [
                {
                        "key" : "TOM",
                        "sweight" : "2"
                },{
                        "key" : "Kruse",
                        "sweight" : "2"
                }

        ],
        "contentId" : "CON_3",
        "keyword" : "Jerry",
        "_id" : ObjectId("55ded619e4b0406ccd901a47")
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果您想搜索所有字段。 然后你可以做一个 match _all 查询,

    POST <index name>/<type name>/_search.
         {
         "query": {
            "match" : {
                "_all" : "Jerry"
                }
            }
        }
    

    这会在所有字段中搜索“Jerry”。

    【讨论】:

      【解决方案2】:

      Multi-Match 查询是您需要在多个字段中搜索的内容。下面的查询将在“searchcontent.key”和“keyword”这两个字段中搜索单词“jerry”,这就是你想要的。

      POST <index name>/<type name>/_search
      {
         "query": {
            "multi_match": {
               "query": "jerry",
               "fields": [
                  "searchcontent.key",
                  "keyword"
               ]
            }
         }
      }
      

      【讨论】:

      • 感谢您的回复,但在“Jerry”的“searchcontent.key”字段上使用 Multi-Match 进行搜索时,我没有获得搜索到的数据。下面是示例 sn -p QueryBuilder query1= QueryBuilders.multiMatchQuery(title, "searchcontent.key","keyword").type(MatchQueryBuilder.Type.PHRASE); .
      • client.prepareSearch("index").setTypes("type").setQuery(QueryBuilders.multiMatchQuery("Jerry","searchcontent.key","keyword")).execute()。动作获取();试试这个
      【解决方案3】:

      没有单一的解决方案,这取决于您如何在弹性搜索中映射数据以及您要索引什么

      GET /intu/_settings

      您可以使用:查询字符串

      如果您不需要合并过滤器,您可以删除 bool 和 should。

      来自文档:“bool 查询采用更多匹配更好的方法,因此每个匹配的必须或应该子句的分数将加在一起,以提供每个文档的最终 _score。”

      例如:

      GET /yourstaff/_search
      {
      "query": {
        "filtered": {
           "query": {
              "bool": {
                 "should":
                    {
                       "query_string": {
                          "query": "jerry"
                       }
                    }
              }
           }
        }
       }
      }
      

      查看文档:

      使用Sense 找出您想要的结果

      【讨论】:

        【解决方案4】:

        使用过滤器是一个更好的选择,因为它会缓存结果..

        {
         "query":
         {
          "bool":
          {
           "should":
           [
            {
             "term":
             {
              "searchcontent.key":"jerry"
             }
            },
           {
            "term":
            {
             "keyword":"jerry"
            }
           }
          ]
         }
        }
        }
        

        https://www.elastic.co/blog/found-optimizing-elasticsearch-searches

        建议阅读以更好地搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多