代码之家  ›  专栏  ›  技术社区  ›  nikli

如何组合查询字符串和术语查询?

  •  0
  • nikli  · 技术社区  · 6 年前

    我需要组合查询字符串和条件查询 section.text=2525 and section.type_id=3 然后请求并得到结果计数2,但结果必须只有1(id=7)。相同 section text 有2525和 type_id topics section.text 有2525和 section.type_id 有3个。请帮忙。以下为示例:

    创建索引:

    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" : { }
        }
      }
    }
    

    或者

    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" : { }
        }
      }
    }
    

    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 回复  |  直到 6 年前
        1
  •  1
  •   Piotr Pradzynski    6 年前

    你可以试着用 nested mapping nested 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": {}
        }
      }
    }