我有三个带有“ userName”字段的文档:
当我搜索 ‘brian’时,我将所有三个都按预期返回,但是当我搜索“布莱恩迪利”时,我仍然将所有三个都恢复了。分析API告诉我它在搜索字符串上使用了ngram过滤器,但我不确定为什么。这是我的设置:
index settings:
{
"analysis": {
"analyzer": {
"username_index": {
"tokenizer": "keyword",
"filter": ["lowercase", "username_ngram"]
},
"username_search": {
"tokenizer": "keyword",
"filter": ["lowercase"]
}
},
"filter": {
"username_ngram": {
"type": "edgeNGram",
"side" : "front",
"min_gram": 1,
"max_gram": 15
}
}
}
}
mapping:
{
"user_follow": {
"properties": {
"targetId": { "type": "string", "store": true },
"followerId": { "type": "string", "store": true },
"dateUpdated": { "type": "date", "store": true },
"userName": {
"type": "multi_field",
"fields": {
"userName": {
"type": "string",
"index": "not_analyzed"
},
"autocomplete": {
"type": "string",
"index_analyzer": "username_index",
"search_analyzer": "username_search"
}
}
}
}
}
}
search:
{
"from" : 0,
"size" : 50,
"query" : {
"bool" : {
"must" : [ {
"field" : {
"targetId" : "51888c1b04a6a214e26a4009"
}
}, {
"match" : {
"userName.autocomplete" : {
"query" : "brian",
"type" : "boolean"
}
}
} ]
}
},
"fields" : "followerId"
}
我尝试过matchQuery,matchPhraseQuery,textQuery和termQuery(java DSL api),每次都得到相同的结果。
我认为您没有完全按照自己的想法做。这就是为什么用完整的curl
语句来呈现实际的测试用例而不是简化它的原因。
上面的示例对我有用(稍作修改):
使用设置和映射创建索引:
curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d '
{
"mappings" : {
"test" : {
"properties" : {
"userName" : {
"fields" : {
"autocomplete" : {
"search_analyzer" : "username_search",
"index_analyzer" : "username_index",
"type" : "string"
},
"userName" : {
"index" : "not_analyzed",
"type" : "string"
}
},
"type" : "multi_field"
}
}
}
},
"settings" : {
"analysis" : {
"filter" : {
"username_ngram" : {
"max_gram" : 15,
"min_gram" : 1,
"type" : "edge_ngram"
}
},
"analyzer" : {
"username_index" : {
"filter" : [
"lowercase",
"username_ngram"
],
"tokenizer" : "keyword"
},
"username_search" : {
"filter" : [
"lowercase"
],
"tokenizer" : "keyword"
}
}
}
}
}
'
索引一些数据:
curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '{
"userName" : "briangriffen"
}
'
curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '
{
"userName" : "brianlilley"
}
'
curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '
{
"userName" : "briangumble"
}
'
搜索将brian
查找所有文档:
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '{
"query" : {
"match" : {
"userName.autocomplete" : "brian"
}
}
}
'
# {
# "hits" : {
# "hits" : [
# {
# "_source" : {
# "userName" : "briangriffen"
# },
# "_score" : 0.1486337,
# "_index" : "test",
# "_id" : "AWzezvEFRIykOAr75QbtcQ",
# "_type" : "test"
# },
# {
# "_source" : {
# "userName" : "briangumble"
# },
# "_score" : 0.1486337,
# "_index" : "test",
# "_id" : "qIABuMOiTyuxLOiFOzcURg",
# "_type" : "test"
# },
# {
# "_source" : {
# "userName" : "brianlilley"
# },
# "_score" : 0.076713204,
# "_index" : "test",
# "_id" : "fGgTITKvR6GJXI_cqA4Vzg",
# "_type" : "test"
# }
# ],
# "max_score" : 0.1486337,
# "total" : 3
# },
# "timed_out" : false,
# "_shards" : {
# "failed" : 0,
# "successful" : 5,
# "total" : 5
# },
# "took" : 8
# }
搜索brianlilley
仅找到该文档:
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '
{
"query" : {
"match" : {
"userName.autocomplete" : "brianlilley"
}
}
}
'
# {
# "hits" : {
# "hits" : [
# {
# "_source" : {
# "userName" : "brianlilley"
# },
# "_score" : 0.076713204,
# "_index" : "test",
# "_id" : "fGgTITKvR6GJXI_cqA4Vzg",
# "_type" : "test"
# }
# ],
# "max_score" : 0.076713204,
# "total" : 1
# },
# "timed_out" : false,
# "_shards" : {
# "failed" : 0,
# "successful" : 5,
# "total" : 5
# },
# "took" : 4
# }
问题内容: 我正在尝试为单个属性实现一个 简单的自动完成功能 。 模型: 重新索引后,在 Rails控制台 上的行为就可以了。 之后,我将自动完成操作添加到控制器,并将新路由添加到routes.rb文件。 控制器: 路线: 在这一点上,如果我只是测试以下URL: 然后我在浏览器中得到了预期的结果 : 现在添加一个搜索框。 __header.html.erb:_ 最后是Javascript: 这是使
问题内容: 我具有以下设置和分析器: 我将以下数据发布到其中: 这是我的查询: 我得到了这个结果: 有人可以向我解释说,“名称”中的任何地方都没有“ jax”,但仍然可以匹配吗? 提前致谢 问题答案: 一个在其给定值的查询进行分析。默认情况下,正在使用进行分析,其中包括将n- gram分析置换为,其中第一个与分析的匹配。 如果您不希望出现这种情况,则可以使用字段将其他分析器指定为,例如:
问题内容: 我正在对具有字符串类型数组的文档字段进行自动完成建议。我的文件如下所示; 我正在 标签 字段上执行自动完成搜索。我的查询就像; 当用户键入“ word”时,我要显示“ wordland”和“ wordpress”。但是,我无法做到这一点。 您能帮上忙吗? 谢谢 问题答案: 您是否尝试过完成建议?解决问题的一种方法如下: 1)创建索引: 2)使用完成建议者类型创建映射: 3)添加文件:
我在netbeans中创建了一个桌面应用程序,到昨天为止还很好,但现在需求发生了变化,客户机希望所有的JTextField都是自动完成的,源码是databse,我搜索并试图找到任何适合netbeans的例子,但我无法找到这样的东西,所以请帮助我如何在netbeans中实现自动完成的东西?请帮忙
设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 备份与自动完成 ⇒ 自动完成 ⇒ 勾选 "所有输入均启用自动完成","函数自动完成","输入时提示函数参数" 我之前所用过的自动完成功能,至少包括: docbook的自动完成的支持。各种标签(docbook中称为元素)的自动完成: python的自动完成的支持,包括函数和库: php中可以自动完成函数: 还有函数参数提示: 此自动完成的好处,还是很明显的
我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种