elasticsearch通配符搜索和运算符

时间:2012-10-22 07:31:22

标签: node.js wildcard elasticsearch

我正在开发一个使用弹性搜索的应用程序,在某些情况下,我想根据术语和区域设置进行搜索。我在localhost上测试这个

http://localhost:9200/index/type/_search

和参数

query : {
                        wildcard : { "term" : "myterm*" }
                    },
                    filter : {
                        and : [
                            {
                                term : { "lang" : "en" }
                            },
                            {
                                term : { "translations.lang" : "tr" } //this is subdocument search
                            },
                        ]
                    }

以下是一个示例文档:

{
    "_index": "twitter",
    "_type": "tweet",
    "_id": "5084151d2c6e5d5b11000008",
    "_score": null,
    "_source": {
      "lang": "en",
      "term": "photograph",
      "translations": [
        {
          "_id": "5084151d2c6e5d5b11000009",
          "lang": "tr",
          "translation": "fotoğraf",
          "score": "0",
          "createDate": "2012-10-21T15:30:37.994Z",
          "author": "anonymous"
        },
        {
          "_id": "50850346532b865c2000000a",
          "lang": "tr",
          "translation": "resim",
          "score": "0",
          "createDate": "2012-10-22T08:26:46.670Z",
          "author": "anonymous"
        }
      ],
      "author": "anonymous",
      "createDate": "2012-10-21T15:30:37.994Z"
    }
  }

我正在尝试使用输入语言“en”和输出语言“tr”获取带通配符(用于自动完成)的术语。它正在获得具有“myterm”但不适用的术语,以及对此的操作。任何建议将不胜感激

提前致谢

2 个答案:

答案 0 :(得分:2)

我猜想translations元素有nested类型。如果是这种情况,您应该使用nested查询:

curl -XPOST "http://localhost:9200/twitter/tweet/_search" -d '{
    query: {
        wildcard: {
            "term": "term*"
        }
    },
    filter: {
        and: [{
            term: {
                "lang": "en"
            }
        }, {
            "nested": {
                "path": "translations",
                "query": {
                    "term" : { "translations.lang" : "tr" }
                }
            }
        }]
    }
}'

答案 1 :(得分:1)

我已设法通过以下查询解决我的问题;

query : {
   wildcard : { "term" : "myterm*" }
},
filter : {
   and : [
      {
         term : { "lang" : "en" }
      },
      {
         term : { "translations.lang" : "tr" } //this is subdocument search
      }
   ]
},
sort : {
   {"term" : "desc"}
}

这里重点是,您需要将排序字段设置为not_analyzed。因为,您无法对分析的字段进行排序。