我是新的弹性搜索,我是集成它与MongoDB,以索引和搜索数据。
所有这些都很好,我使用以下示例构建索引:
curl -XPUT localhost:9200/test/newperson/1 -d '{
"type": "mongodb",
"mongodb": {
"servers": [
{ "host": "pc-4372", "port": 27017 }
],
"db": "newPerson",
"collection": "Person",
"options": { "secondary_read_preference": true },
"gridfs": false
},
"index": {
"name": "mongoIndex",
"type": "Person"
}
}'我目前正在构建一个web服务,它将使用Java来执行所需的搜索查询。
我需要使用两个相同的值“术语查询”在构建的索引中进行搜索。我知道对于术语查询,我们需要使用分析器来分析文本并能够检索相同的值。
我尝试过几种方法来为某些字段构建索引和指定分析器,但我做不到。我也尝试过从Java级别进行索引和指定分析器,它运行得很好,但只有一个字段不能用两个字段来实现。
SearchResponse r1 = client.prepareSearch("rootcause")
.setQuery(QueryBuilders.queryString("_id:" + rc.getRootCause_ID()).analyzer("snowball"))
.execute()
.actionGet();我正在建立一个原型来诊断一些设备故障,
我想通过设备模型和用户输入的症状进行搜索。我还尝试了以下代码:
SearchResponse response = client.prepareSearch("modelsymptom")
.setQuery(QueryBuilders.queryString("model_id: " + "MO-1" + " AND " + "symptom: RC-4").analyzer("snowball"))
.execute()
.actionGet();从上述查询中检索到的结果包含RC-4或MO-1和其他不正确的所有文档。此查询只应检索一个结果。
使用指定的分析器构建索引,或者从Java级别进行索引,还有什么更好的呢?
根据我的理解,我认为用索引构建分析器会更好,但我不知道到目前为止是怎样的。
发布于 2016-03-28 23:00:28
我知道对于术语查询,我们需要使用分析器来分析文本并能够检索相同的值。
那是不对的。
尽管全文查询将在执行前分析查询字符串,但术语级查询将对存储在倒排索引中的确切术语进行操作。
查询全文字段时,应使用匹配查询,以了解如何分析该字段。
否则,您将遇到以下问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
使用指定的分析器构建索引,或者从Java级别进行索引,还有什么更好的呢?
不管是哪种情况,都取决于您的具体情况。
如果需要,可以使用Java的分析器创建索引。
String analyser = "{...}";
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.setSettings(analyser);
createIndexRequestBuilder.execute().actionGet();你的分析器是这样的:
{
"analysis":
{
"analyzer":
{
"my_analiser":
{
"type": "english"
}
}
}
}但是,您将需要创建您自己的自定义映射,并在那里指定分析器。
如果您没有指定自己的映射,当Elasticsearch检测到文档中的新字符串字段时,它会自动将其配置为全文字符串字段,并使用标准分析器对其进行分析。这可能对您来说已经足够了,但通常情况下是不够的,您需要构建自己的映射。您也可以通过Java实现这一点。
// Index (and mapping) do not exist
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.addMapping("typeName", mapping);
response = createIndexRequestBuilder.execute().actionGet();
// Index exists but not mapping
PutMappingRequestBuilder preparePutMappingBuilder =
client.admin().indices().preparePutMapping("indexName");
preparePutMappingBuilder.setSource(mapping).setType("typeName");
response = preparePutMappingBuilder.execute().actionGet();如何利用分析器和Java中的两个参数进行弹性搜索术语查询
可以使用复合查询(如布尔查询)组合两个术语查询:
或者使用术语查询:
但是根据您在这里所描述的,如果您确实需要使用分析过的文本,您更可能需要多匹配查询,或者使用两个匹配查询的布尔查询。
MultiMatchQueryBuilder queryBuilder =
new MultiMatchQueryBuilder("foo", "fieldOne", "fieldTwo");
client.prepareSearch()
.setIndices(index)
.setQuery(queryBuilder)
.execute().actionGet();或者:
QueryBuilder firstQueryBuilder = QueryBuilders.matchQuery("fieldOne", "foo");
QueryBuilder secondQueryBuilder = QueryBuilders.matchQuery("fieldTwo", "foo");
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(firstQueryBuilder);
boolQueryBuilder.must(secondQueryBuilder);
client.prepareSearch()
.setIndices(index)
.setQuery(queryBuilder)
.execute().actionGet();希望这能有所帮助。
发布于 2016-03-27 22:39:18
您不需要任何特殊的分析器,只需使用bool查询与“必须”和两个术语。而“简单查询”主要存在于手动测试查询,我不会在代码中使用它。此外,始终首先使用REST尝试查询。
{
"query": {
"bool": {
"must": [
{
"term": {
"model": "XXXX",
}
},
{
"term": {
"symptom": "YYYY"
}
}
]
}
}
}
https://stackoverflow.com/questions/36252691
复制相似问题