如何构造此弹性搜索查询对象?

时间:2013-03-05 08:43:26

标签: elasticsearch

我的文档索引如下:

{
    title: "stuff here",
    description: "stuff here",
    keywords: "stuff here",
    score1: "number here",
    score2: "number here"
}

我想执行一个查询:

  • 使用标题,说明和关键字字段匹配文字字词。
  • 不一定要完全匹配。例如。如果有人搜索“我有一个大鼻子”,并且“鼻子”在其​​中一个文档标题中,但“大”不是,则仍应返回此文档。

编辑:我尝试了这个查询,但它确实有效。有人可以确认这是否是正确的方法吗?感谢。

{
    query:{
        'multi_match':{
            'query': q,
            'fields': ['title^2','description', 'keywords'],
        }
    }
}

3 个答案:

答案 0 :(得分:2)

你的方式绝对是要走的路!

multi_match查询通常是您要向最终用户公开的查询,而query_string类似,但由于它公开了lucene query syntax,因此也更加强大和危险。经验法则:如果您不需要,请不要使用查询字符串。

此外,只需提供您要搜索的字段列表就可以轻松搜索多个字段,而无需bool query

答案 1 :(得分:0)

以下是将创建您可以使用的查询的代码。我在 c#中写了它,但它也可以用其他语言工作。

您需要做的是创建 BooleanQuery 并设置其条件中至少有一个必须匹配。然后使用 Occur.SHOULD 枚举值为要检查的每个文档字段添加条件:

BooleanQuery searchQuery = new BooleanQuery();
searchQuery.SetMinimumNumberShouldMatch(1);

QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "title", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
Query titleQuery = parser.Parse("I have a big nose");
searchQuery.Add(titleQuery, BooleanClause.Occur.SHOULD);

parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "description", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
Query descriptionQuery = parser.Parse("I have a big nose");
searchQuery.Add(titleQuery, BooleanClause.Occur.SHOULD);

parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "keywords", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
Query keywordsQuery = parser.Parse("I have a big nose");
searchQuery.Add(titleQuery, BooleanClause.Occur.SHOULD);

Query queryThatShouldBeExecuted.Add(searchQuery, BooleanClause.Occur.MUST);

以下是java http://www.javadocexamples.com/java_source/org/apache/lucene/search/TestBooleanMinShouldMatch.java.html

中示例的链接

答案 2 :(得分:0)

执行HTTP Post请求的相应JSON对象是:

{
  "bool": {
    "should": [
      {
        "query_string": {
          "query": "I have a big nose",
          "default_field": "title"
        }
      },
      {
        "query_string": {
          "query": "I have a big nose",
          "default_field": "description"
        }
      },
      {
        "query_string": {
          "query": "I have a big nose",
          "default_field": "keywords"
        }
      }
    ],
    "minimum_number_should_match": 1,
    "boost": 1
  }
}