我是 Elastic Search 的新手,我正在将它与 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 API 来执行所需的搜索查询。
我需要在构建的索引中搜索两个相同的值“术语查询”。我知道对于术语查询,我们需要使用分析器来分析文本并能够检索相同的值。
我尝试了几种方法来构建索引并为某些字段指定分析器,但我做不到。我也尝试从 Java API 级别做到这一点,它工作正常,但只有一个字段,我无法用两个字段做到这一点。
SearchResponse r1 = client.prepareSearch("rootcause")
.setQuery(QueryBuilders.queryString("_id:" + rc.getRootCause_ID()).analyzer("snowball"))
.execute()
.actionGet();
我正在构建一个原型(prototype)来诊断一些设备故障,
我想按设备型号和用户输入的症状进行搜索。我也尝试过以下代码:
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 API 级别构建索引更好?
根据我的理解,我认为肯定用索引构建分析器会更好,但我不知道到目前为止。
最佳答案
I know that for term queries we need to use analyzers to analyze text and be able to retrieve identical values.
这是不正确的。
虽然全文查询将在执行前分析查询字符串,但术语级查询对存储在倒排索引中的确切术语进行操作。
查询全文字段时,请改用匹配查询,它了解字段的分析方式。
否则,您将遇到此处描述的问题:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
What is better, to build an index with a prescribed analyzer or to do it from the Java API level?
无论哪种方式,这取决于您的具体情况。
如果需要,您可以使用 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();
How to perfrom Elastic Search Term Query with Analyzer and Two Parameters in Java API
您可以使用复合查询(如 boolean 查询)组合两个术语查询:
或使用条款查询:
但是根据您在此处描述的内容,如果您确实需要使用已分析的文本,则更有可能需要多匹配查询,或者具有两个匹配查询的 boolean 查询。
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();
希望这可以帮助。
关于spring - 如何在 Java API 中使用 Analyzer 和两个参数执行 Elasticsearch 词查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36252691/