como procurar marcas na pesquisa elastica

Estou a criar um projecto de Galeria de fotografias onde as fotografias podem ter até 50 marcas (tal como em shutterstock e fotolia). Estou a criar a minha busca na busca elastica. Tenho um campo com a palavra-chave datatype na elasticsearch. Quando a consulta vem como" fundo abstrato", eu quero procurar abstrato e fundo em todas as palavras-chave das imagens e ordená-los pela sua relevância. Não deve corresponder ao abstr backgrou. Escrevi uma pergunta como esta.
 "query": {
    "bool": {
      "should": [
        {
          "match": {
            "keyword": {
              "query": "abstract, background"
            }
          }
        }
      ]
    }
  }

só funciona para a combinar palavras-chave únicas. Eu quero corresponder para várias palavras-chave e também classificá-los pela sua relevância. Obrigado.

-----editar------

Estes são os meus mapeamentos. O campo do título funciona bem. A categoria é apenas usada para agregações e a palavra-chave é o campo principal para corresponder.

PUT /freevects
{
  "mappings": {
    "photos": {
      "properties": {
        "title": {
          "type": "text",
          "boost": 1.9,
          "analyzer": "standard"
        },
        "keyword": {
          "type": "keyword",
          "boost": 1.4
        },
        "category": {
          "type": "keyword",
          "index": false
        },
        "quality": {
          "type": "short",
          "index": false,
          "boost": 1.1
        },
        "downloads": {
          "type": "integer",
          "index": false,
          "boost": 1.1
        },
        "likes": {
          "type": "integer",
          "index": false,
          "boost": 1
        },
        "filename": {
          "type": "keyword",
          "index": false
        },
        "type": {
          "type": "keyword",
          "index": false
        },
        "free": {
          "type": "short",
          "index": false
        },
        "created": {
          "type": "date",
          "index": false
        }
      }
    }
  }
}
Author: Muhammad Hamza Ali, 2017-03-30

1 answers

O porblem é com o mapeamento do campo keyword. É de type: keyword no seu mapeamento. Isto não indica a sua consulta de pesquisa e os valores indexados. Então, quando você busca, os termos são pesquisados como está. Exemplo: procurar por: "abstract, background" como você fez em sua pergunta, na verdade irá procurar apenas ocorrem exatas de "abstract, background" no campo Palavra-chave. Mudar o mapeamento do campo palavras-chave para:

"keyword": {
  "type": "text",
  "boost": 1.4
}

E indexar os seus valores como:

{
  "keyword": ["abstract", "background"]
}

Seria o meu sugestao.

Referência: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html

Pesquisa por marcas de pesquisa:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "keyword": "abstract"
          }
        },
        {
          "match": {
            "keyword": "background"
          }
        }
      ]
    }
  }
}

Editar: mudou o tipo de texto para texto porque está desactualizado na versão mais recente do elástico, como indicado pelo OP.

 3
Author: Archit Saxena, 2018-06-10 17:28:51