ElasticSearch: Comportamiento de búsqueda extraño cuando se usa el analizador de bola de nieve

StackOverflow https://stackoverflow.com//questions/9700962

  •  13-12-2019
  •  | 
  •  

Pregunta

Así que digamos que tengo un índice de elasticsearch definido así:

curl -XPUT 'http://localhost:9200/test' -d '{
  "mappings": {
    "example": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "snowball"
        }
      }
    }
  }
}'

curl -XPUT 'http://localhost:9200/test/example/1' -d '{
  "text": "foo bar organization"
}'

Cuando busco "organizaciones de foo" con analizador de bola de nieve, ambas palabras clave coinciden como se esperan:

curl -XGET http://localhost:9200/test/example/_search -d '{
  "query": {
    "text": {
      "_all": {
        "query": "foo organizations",
        "analyzer": "snowball"
      }
    }
  },
  "highlight": {
    "fields": {
      "text": {}
    }
  }
}'

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.015912745,
    "hits": [
      {
        "_index": "test",
        "_type": "example",
        "_id": "1",
        "_score": 0.015912745,
        "_source": {
          "text": "foo bar organization"
        },
        "highlight": {
          "text": [
            "<em>foo</em> bar <em>organization</em>"
          ]
        }
      }
    ]
  }
}

Pero cuando busco solo "organizaciones", no obtengo ningún resultado, lo cual es muy raro:

curl -XGET http://localhost:9200/test/example/_search -d '{
  "query": {
    "text": {
      "_all": {
        "query": "organizations",
        "analyzer": "snowball"
      }
    }
  },
  "highlight": {
    "fields": {
      "text": {}
    }
  }
}'

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

Sin embargo, si busco "Barras", aún golpea:

curl -XGET http://localhost:9200/test/example/_search -d '{
  "query": {
    "text": {
      "_all": {
        "query": "bars",
        "analyzer": "snowball"
      }
    }
  },
  "highlight": {
    "fields": {
      "text": {}
    }
  }
}'

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.10848885,
    "hits": [
      {
        "_index": "test",
        "_type": "example",
        "_id": "1",
        "_score": 0.10848885,
        "_source": {
          "text": "foo bar organization"
        },
        "highlight": {
          "text": [
            "foo <em>bar</em> organization"
          ]
        }
      }
    ]
  }
}

Supongo que la diferencia entre "Barra" y "Organización" es que la "organización" se debe a "órgano", mientras que "Bar" se debe a sí mismo.Pero, ¿cómo obtengo el comportamiento adecuado para que la segunda búsqueda golpea?

¿Fue útil?

Solución

Texto "Foo Bar Organización" se está indexando dos veces, en el campo Texto y en el campo _all .El campo text está utilizando el analizador de bola de nieve, y el campo _all está utilizando el analizador estándar.Por lo tanto, después del análisis del registro de prueba, el campo _all contiene tokens: "foo", "bar" y "organización".Durante la búsqueda, el analizador de bola de nieve especificada se convierte en "foo" en "foo", "barras" en "barra" y "organización" en "órgano".Por lo tanto, las palabras "foo" y "bares" en la consulta coinciden con el registro de prueba y el término "organización" no.El resaltado se realiza según la base de campo de forma independiente de la búsqueda y es por eso que la palabra "organización" se resalta en el primer resultado.

Otros consejos

Es mejor usar Analyzer en el índice de tiempo que el tiempo de búsqueda ... Mape su campo de texto al analizador de bolas de nieve y luego Índice.Esto creará algunas fichas para la organización que incluye organizaciones. Funciona para mí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top