如何结合使用query_string和字词查询?

时间:2018-08-16 12:12:29

标签: elasticsearch query-string elasticsearch-dsl

我需要将section.text=2525 and section.type_id=3然后请求并获得结果计数2的查询字符串和术语查询结合​​起来,但结果必须仅为1(id = 7)。相同的section必须具有25的text和具有3的type_id,但是它获得的topics具有2525的section.text和具有3的section.type_id。救命。下面有示例:

创建索引:

POST testix/topic/
{
  "id" : "5",
  "name" : "Document APIs",
  "section": [
    {
      "id" : "11",
      "topic_id" : "5",
      "type_id" : "3",
      "text" : "Semper feugiat nibh sed pulvinar. Diam vulputate ut pharetra sit amet aliquam id. Nunc consequat interdum varius sit amet mattis vulputate."
    },
    {
      "id" : "12",
      "topic_id" : "5",
      "type_id" : "2",
      "text" : "Ipsum faucibus vitae aliquet nec ullamcorper sit. Odio eu feugiat pretium nibh. 2525"
    }
  ]
}


POST testix/topic/
{
  "id" : "7",
  "name" : "Search APIs",
  "section": [
    {
      "id" : "15",
      "topic_id" : "7",
      "type_id" : "3",
      "text" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 2525"
    },
    {
      "id" : "16",
      "topic_id" : "7",
      "type_id" : "2",
      "text" : "Nam at lectus urna duis convallis convallis tellus id interdum. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Blandit massa enim nec dui nunc mattis enim ut. "
    },
    {
      "id" : "17",
      "topic_id" : "7",
      "type_id" : "6",
      "text" : "Sodales ut etiam sit amet nisl purus in. Laoreet non curabitur gravida arcu ac tortor dignissim. "
    }
  ]
}

POST testix/topic/
{
  "id" : "9",
  "name" : "Request Body Search",
  "section": [
    {
      "id" : "3",
      "topic_id" : "9",
      "type_id" : "1",
      "text" : "Et malesuada fames ac turpis egestas maecenas pharetra convallis. Consectetur purus ut faucibus pulvinar elementum integer enim neque. Lorem sed risus ultricies tristique."
    },
    {
      "id" : "4",
      "topic_id" : "9",
      "type_id" : "2",
      "text" : "Egestas diam in arcu cursus. 2525 Tellus integer feugiat scelerisque varius morbi enim nunc faucibus."
    },
    {
      "id" : "5",
      "topic_id" : "9",
      "type_id" : "4",
      "text" : "At consectetur lorem donec massa. Eu augue ut lectus arcu bibendum at varius vel pharetra."
    }

  ]
}

POST testix/topic/
{
  "id" : "19",
  "name" : "Request Body Search",
  "section": [
    {
      "id" : "13",
      "topic_id" : "19",
      "type_id" : "1",
      "text" : "Egestas diam in arcu cursus. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus."
    },
    {
      "id" : "15",
      "topic_id" : "19",
      "type_id" : "4",
      "text" : "Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. "
    }

  ]
}

搜索请求:

GET testix/_search
{
    "query": {
      "bool" : {
        "must" : [
          {
            "query_string" : {
              "query" : "section.text:2525",
              "fields" : [
                "section.text^2.0"
              ]
            }
          },
          {
          "terms" : {
            "section.type_id" : ["3"]
          }
        }
        ]
      }
    },
    "highlight" : {
    "pre_tags" : [
      "<mark>"
    ],
    "post_tags" : [
      "</mark>"
    ],
    "fragment_size" : 50,
    "number_of_fragments" : 3,
    "fragmenter" : "simple",
    "fields" : {
      "section.text" : { }
    }
  }
}

OR

GET testix/_search
{
    "query": {
        "query_string" : {
            "query" : "(section.text:2525 AND section.type_id:3)"
        }

    },
    "highlight" : {
    "pre_tags" : [
      "<mark>"
    ],
    "post_tags" : [
      "</mark>"
    ],
    "fragment_size" : 50,
    "number_of_fragments" : 3,
    "fragmenter" : "simple",
    "fields" : {
      "section.text" : { }
    }
  }
}

OR

http://localhost:9200/testix/_search?q=(section.text:2525 AND section.type_id:3)

但是结果:

{
  "_index": "testix",
  "_type": "topic",
  "_id": "AWVCeAmZpXk_CuwTJ8K1",
  "_score": 1.0631888,
  "_source": {
    "id": "7",
    "name": "Search APIs",
    "section": [
      {
        "id": "15",
        "topic_id": "7",
        "type_id": "3",
        "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 2525"
      },
      {
        "id": "16",
        "topic_id": "7",
        "type_id": "2",
        "text": "Nam at lectus urna duis convallis convallis tellus id interdum. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Blandit massa enim nec dui nunc mattis enim ut. "
      },
      {
        "id": "17",
        "topic_id": "7",
        "type_id": "6",
        "text": "Sodales ut etiam sit amet nisl purus in. Laoreet non curabitur gravida arcu ac tortor dignissim. "
      }
    ]
  },
  "highlight": {
    "section.text": [
      " et dolore magna aliqua. <mark>2525</mark>"
    ]
  }
},
{
  "_index": "testix",
  "_type": "topic",
  "_id": "AWVCd9yppXk_CuwTJ8K0",
  "_score": 0.5235683,
  "_source": {
    "id": "5",
    "name": "Document APIs",
    "section": [
      {
        "id": "11",
        "topic_id": "5",
        "type_id": "3",
        "text": "Semper feugiat nibh sed pulvinar. Diam vulputate ut pharetra sit amet aliquam id. Nunc consequat interdum varius sit amet mattis vulputate."
      },
      {
        "id": "12",
        "topic_id": "5",
        "type_id": "2",
        "text": "Ipsum faucibus vitae aliquet nec ullamcorper sit. Odio eu feugiat pretium nibh. 2525"
      }
    ]
  },
  "highlight": {
    "section.text": [
      ". Odio eu feugiat pretium nibh. <mark>2525</mark>"
    ]
  }
}

所需结果:

{
  "_index": "testix",
  "_type": "topic",
  "_id": "AWVCeAmZpXk_CuwTJ8K1",
  "_score": 1.0631888,
  "_source": {
    "id": "7",
    "name": "Search APIs",
    "section": [
      {
        "id": "15",
        "topic_id": "7",
        "type_id": "3",
        "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 2525"
      },
      {
        "id": "16",
        "topic_id": "7",
        "type_id": "2",
        "text": "Nam at lectus urna duis convallis convallis tellus id interdum. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Blandit massa enim nec dui nunc mattis enim ut. "
      },
      {
        "id": "17",
        "topic_id": "7",
        "type_id": "6",
        "text": "Sodales ut etiam sit amet nisl purus in. Laoreet non curabitur gravida arcu ac tortor dignissim. "
      }
    ]
  },
  "highlight": {
    "section.text": [
      " et dolore magna aliqua. <mark>2525</mark>"
    ]
  }
}

1 个答案:

答案 0 :(得分:1)

您可以尝试使用nested mappingnested query

首先使用自定义映射创建索引:

PUT testix
{
  "mappings": {
    "topic": {
      "properties": {
        "section": {
          "type": "nested"
        }
      }
    }
  }
}

然后以与问题相同的方式添加文档:

POST testix/topic/
{
  "id" : "5",
  "name" : "Document APIs",
  "section": [
    {
      "id" : "11",
      "topic_id" : "5",
      "type_id" : "3",
      "text" : "Semper feugiat nibh sed pulvinar. Diam vulputate ut pharetra sit amet aliquam id. Nunc consequat interdum varius sit amet mattis vulputate."
    },
    {
      "id" : "12",
      "topic_id" : "5",
      "type_id" : "2",
      "text" : "Ipsum faucibus vitae aliquet nec ullamcorper sit. Odio eu feugiat pretium nibh. 2525"
    }
  ]
}

POST testix/topic/
{
  "id" : "7",
  "name" : "Search APIs",
  "section": [
    {
      "id" : "15",
      "topic_id" : "7",
      "type_id" : "3",
      "text" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 2525"
    },
    {
      "id" : "16",
      "topic_id" : "7",
      "type_id" : "2",
      "text" : "Nam at lectus urna duis convallis convallis tellus id interdum. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Blandit massa enim nec dui nunc mattis enim ut. "
    },
    {
      "id" : "17",
      "topic_id" : "7",
      "type_id" : "6",
      "text" : "Sodales ut etiam sit amet nisl purus in. Laoreet non curabitur gravida arcu ac tortor dignissim. "
    }
  ]
}

POST testix/topic/
{
  "id" : "9",
  "name" : "Request Body Search",
  "section": [
    {
      "id" : "3",
      "topic_id" : "9",
      "type_id" : "1",
      "text" : "Et malesuada fames ac turpis egestas maecenas pharetra convallis. Consectetur purus ut faucibus pulvinar elementum integer enim neque. Lorem sed risus ultricies tristique."
    },
    {
      "id" : "4",
      "topic_id" : "9",
      "type_id" : "2",
      "text" : "Egestas diam in arcu cursus. 2525 Tellus integer feugiat scelerisque varius morbi enim nunc faucibus."
    },
    {
      "id" : "5",
      "topic_id" : "9",
      "type_id" : "4",
      "text" : "At consectetur lorem donec massa. Eu augue ut lectus arcu bibendum at varius vel pharetra."
    }
  ]
}

POST testix/topic/
{
  "id" : "19",
  "name" : "Request Body Search",
  "section": [
    {
      "id" : "13",
      "topic_id" : "19",
      "type_id" : "1",
      "text" : "Egestas diam in arcu cursus. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus."
    },
    {
      "id" : "15",
      "topic_id" : "19",
      "type_id" : "4",
      "text" : "Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. "
    }
  ]
}

并查询结果:

GET testix/_search
{
  "query": {
    "nested": {
      "path": "section",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "section.text:2525",
                "fields": [
                  "section.text^2.0"
                ]
              }
            },
            {
              "terms": {
                "section.type_id": ["3"]
              }
            }
          ]
        }
      }
    }
  },
  "highlight": {
    "pre_tags": [
      "<mark>"
    ],
    "post_tags": [
      "</mark>"
    ],
    "fragment_size": 50,
    "number_of_fragments": 3,
    "fragmenter": "simple",
    "fields": {
      "section.text": {}
    }
  }
}