我正在使用ElasticSearch Java API进行搜索。我有四个领域:
搜索时我正在使用以下查询:
QueryBuilder qb = QueryBuilders.queryString(“ Pritish ”);
搜索时包含密钥。另外,我不想选择文件:
.fields(“DOB”,“name”,“address”)
有没有办法排除字段?我在寻找ParitalFields。这对我的情况有用吗?有人可以为此提供java示例吗?
现在,我添加了映射如下:
/ ***************************** 创建索引 ***** ******** /
XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject(indexName)
.startObject("properties")
.startObject("key")
.field("type", "string")
.field("index","not_analyzed")
.field("store", "false")
.endObject()
.startObject("addr1")
.field("type","string")
.endObject()
.startObject("DOB")
.field("type","string")
.endObject()
.startObject("name")
.field("type","string")
.endObject()
.endObject()
.endObject()
.endObject();
client.admin()
.indices()
.preparePutMapping(indexName)
.setType(indexName)
.setSource(mapping)
.execute()
.actionGet();
/ ********************** 插入数据 ************ ***************** /
XContentBuilder x = jsonBuilder()
.startObject()
.field("key", key)
.field("addr1", "abc road")
.field("DOB", "09092009")
.field("name","test")
.endObject();
bulk.add(client.prepareIndex(indexName, indexName).setSource(x));
/ ************* 搜索查询 ********************* * /
QueryBuilder qb =QueryBuilders.queryString("*e434*");
SearchResponse response = client.prepareSearch(indexName)
.setQuery(qb)
.setFrom(0)
.setSize(100)
.execute()
.actionGet();
SearchHit[] results = response.getHits().hits();
当我看到索引元数据时,它显示我正确的映射如下:
mappings: {
indexName: {
properties: {
addr1: {
type: string
}
name: {
type: string
}
key: {
index: not_analyzed
type: string
}
acct_type: {
type: string
}
}
}
}
现在,当我执行搜索查询时,它仍然显示搜索密钥的结果。
我不确定出了什么问题。有人可以帮忙解决这个问题吗?
答案 0 :(得分:3)
在彻底阅读了映射文档之后,我终于在创建映射时发现了我的错误。我正在为密钥创建映射,如下所示(请参阅问题中的代码):
字段("指数"" not_analyzed&#34)强>
阅读完文件后,我改变了上面一行:
字段("指数""无&#34)强>
我非常感谢CodeSculptor的想法。现在,它按照我的要求工作。
非常感谢你。
答案 1 :(得分:1)
根据我的理解,您不想搜索这个特定字段。在这种情况下,部分字段(在Elastic Search 1.0.0beta1中由源过滤替换)对您没有用,因为它们与查询不同,仅用于从结果文档中获取部分信息。如果在某个字段上执行搜索,则不会影响。
您只能使用扩展QueryBuilder界面的某些类选择特定字段进行搜索,这对您来说是个坏消息,只有通过添加字段才能选择字段。
另一方面,如果您不希望在某个特定情况下搜索此特定字段,但它只是一个将包含相关信息的字段,并且永远不会被搜索在,您可以将此字段指定为未编入索引。您可以在mapping时将字段的index
属性设置为no
。这应该导致具有将整个JSON存储和返回的字段作为文档的源,但不能被搜索。