如果结果以单词

时间:2015-11-16 23:56:38

标签: elasticsearch

我使用Elasticsearch使用ngram过滤器进行自动完成搜索。如果以搜索关键字开头,我需要提升结果。

我的查询很简单:

"query": {
   "match": {
      "query": "re",
      "operator": "and"
   }
}

这是我的结果:

  • RE staurants
  • Couture et 重新触及
  • 重新 stauration rapide

但我希望他们这样:

  • RE staurants
  • 重新 stauration rapide
  • Couture et 重新触及

如何从关键字开始提升结果?

如果它有帮助,这是我的映射:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "partialAnalyzer": {
                    "type": "custom",
                    "tokenizer": "ngram_tokenizer",
                    "filter": ["asciifolding", "lowercase"]
                },
                "searchAnalyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["asciifolding", "lowercase"]
                }
            },

            "tokenizer": {
                "ngram_tokenizer": {
                    "type": "edge_ngram",
                    "min_gram": "1",
                    "max_gram": "15",
                    "token_chars": [ "letter", "digit" ]
                }
            }
        }
    },

    "mappings": {
        "place": {
            "properties": {
                "name": {
                    "type": "string",
                    "index_analyzer": "partialAnalyzer",
                    "search_analyzer": "searchAnalyzer",
                    "term_vector": "with_positions_offsets"
                }
            }
        }
    }
}

此致

1 个答案:

答案 0 :(得分:7)

这个想法怎么样,不是100%肯定它,因为它取决于我认为的数据:

  • name字段中创建一个子字段,该字段应使用keyword分析器进行分析(几乎保持不变)
  • 使用bool s
  • 将查询更改为should
  • 一个should是您现在拥有的查询
  • 另一个shouldmatch,其中phrase_prefix位于子字段上。

映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "partialAnalyzer": {
          "type": "custom",
          "tokenizer": "ngram_tokenizer",
          "filter": [
            "asciifolding",
            "lowercase"
          ]
        },
        "searchAnalyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "asciifolding",
            "lowercase"
          ]
        },
        "keyword_lowercase": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "asciifolding",
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "place": {
      "properties": {
        "name": {
          "type": "string",
          "index_analyzer": "partialAnalyzer",
          "search_analyzer": "searchAnalyzer",
          "term_vector": "with_positions_offsets",
          "fields": {
            "as_is": {
              "type": "string",
              "analyzer": "keyword_lowercase"
            }
          }
        }
      }
    }
  }
}

查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": {
              "query": "re",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "name.as_is": {
              "query": "re",
              "type": "phrase_prefix"
            }
          }
        }
      ]
    }
  }
}