Elastic search for multiple simple_query_string ups

I have an index set up for all of my documents:

{
  "mappings" {
    "book" {
      "_source": { "enabled": true },
      "properties": [
        "title": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" },
        "description": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" },
        "author": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" }
      ]
    }
  }
}

      

I am pushing this into an index called "library".

What I need to want is search with the following requirements. Assuming the user has logged in something like "big yellow shovel"

  • Search for user-entered keywords in three ways:
    • As in general, the phrase: "a simple yellow shovel"
    • As a set of I-words: "simple + yellow + shovel"
    • As a set of OR keywords: "simple | yellow | shovel"
  • Make sure your keyword sets are performed in order of priority (amplified?):
    • First text
    • And the second second
    • OR third third

Using a simple search query search for a single search:

{
  "query": {
    "simple_query_string": {
      "query": "\"simple yellow shovel\""
    }
  }
}

      

How do I perform multiple up-search? Or should I use something like a match query for indexed fields?

+3
elasticsearch


source to share


2 answers


I'm not sure if I got this right. I took priority ordering author> title> description

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "simple yellow shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "type": "phrase",
                  "boost": 10
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "simple",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              },
              {
                "multi_match": {
                  "query": "yellow",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              },
              {
                "multi_match": {
                  "query": "shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              }
            ]
          }
        },
        {
          "multi_match": {
            "query": "simple",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        },
        {
          "multi_match": {
            "query": "yellow",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        },
        {
          "multi_match": {
            "query": "shovel",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        }
      ]
    }
  }
}

      

Can anyone confirm this? You can refer to Boost Query for more information. Is this what you are looking for?

Hope this helps!



EDIT: Rewritten with dis_max

{
  "query": {
    "bool": {
      "should": [
        {
          "dis_max": {
            "tie_breaker": 0.7,
            "queries": [
              {
                "bool": {
                  "must": [
                    {
                      "multi_match": {
                        "query": "simple yellow shovel",
                        "fields": [
                          "author^7",
                          "title^3",
                          "description"
                        ],
                        "type": "phrase",
                        "boost": 10
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "dis_max": {
                        "tie_breaker": 0.7,
                        "queries": [
                          {
                            "multi_match": {
                              "query": "simple",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          },
                          {
                            "multi_match": {
                              "query": "yellow",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          },
                          {
                            "multi_match": {
                              "query": "shovel",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "multi_match": {
                  "query": "simple",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              },
              {
                "multi_match": {
                  "query": "yellow",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              },
              {
                "multi_match": {
                  "query": "shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              }
            ]
          }
        }
      ]
    }
  }
}

      

This seems to give me much better results, at least on my dataset. This is a great source for understanding dismax

Please play a lot with this and see if you get the results you expect. Use the Explain API .

+4


source to share


I rewrote this with Dis Max Query . Keep in mind that you can try different types to get the best results. See the following:

  • best_fields
  • most_fields
  • cross_fields

Query:



POST /your_index/your_type/_search
{
  "query": {
    "dis_max": {
      "tie_breaker": 0.7,
      "boost": 1.2,
      "queries": [
        {
          "multi_match": {
            "query": "simple yellow showel",
            "type": "phrase",
            "boost": 3,
            "fields": [
              "title^3",
              "author^2",
              "description"
            ]
          }
        },
        {
          "multi_match": {
            "query": "simple yellow showel",
            "operator": "and",
            "boost": 2,
            "fields": [
              "title^3",
              "author^2",
              "description"
            ]
          }
        },
        {
          "multi_match": {
            "query": "simple yellow showel",
            "fields": [
              "title^3",
              "author^2",
              "description"
            ]
          }
        }
      ]
    }
  }
}

      

In the "Maximum Request" field, will select the document that has benefited the most from all three requests. And we give additional impetus to "type": "phrase"

and "operator": "and"

, while we leave the last request intact.

+2


source to share







All Articles