Tablestore SDK for Java ile yapılan nested sorgu, alt satır sınırlarını koruyarak Nested alanındaki verileri eşleştirir ve eşleşen alt satırları döndürebilir.
Ön koşullar
Tablestore SDK for Java öğesini yükleyin ve bir istemci başlatın.
Özellik açıklaması
Nested sorgu, Nested alanındaki alt satırları sorgular. Nested alanındaki her alt satır, kendi alanları arasındaki ilişkileri bağımsız olarak korur. Bir Nested alanının alt alanlarını doğrudan sorgulayamazsınız. Bunun yerine alt sorguyu bir NestedQuery nesnesine sarmalısınız.
NestedQuery.path parametresi, sorgulanacak nested alanın yolunu belirtir. Alt sorgudaki alan adları tam yollar kullanılarak tanımlanmalıdır. Alt sorgu herhangi bir Query türünde olabilir. Çok düzeyli bir nested alanı sorgulamak için path parametresini hedef nested alanın tam yoluna doğrudan ayarlayabilir veya her düzeyi sorgulamak üzere NestedQuery nesnelerini iç içe yerleştirebilirsiniz.
Birden fazla koşulun aynı alt satır tarafından karşılanıp karşılanmayacağı, NestedQuery ve BoolQuery bileşimlerinin nasıl yapılandırıldığına bağlıdır:
Aynı alt satırın birden fazla koşulu karşılamasını zorunlu kılmak için alt koşulları içeren bir
BoolQuerynesnesini tek birNestedQueryiçinde alt sorgu olarak ayarlayın.Farklı alt satırların koşulları ayrı ayrı karşılamasına izin vermek için her koşul için birer
NestedQueryoluşturun ve bu nested sorguları dış birBoolQueryiçinde birleştirin.
Bir nested sorgu yapmak için search yöntemini çağırın. Sorgu koşulunda nested alan yolunu, alt sorguyu ve puanlama modunu belirtin.
SearchResponse search(SearchRequest request)
Aşağıdaki örnek, items nested alanındaki alt satırlardan items.keyword alanı tablestore değerine eşit olanları sorgular. Sorgu en fazla 10 satır ve toplam eşleşme sayısını döndürür.
String tableName = "example_table";
String indexName = "example_index";
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getTotalCount());
System.out.println(response.getRows());
Parametreler
Arama isteği
request parametresi aşağıdaki parametreleri içeren bir SearchRequest nesnesidir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sorgu ayarları
request.searchQuery parametresi aşağıdaki parametreleri içeren bir SearchQuery nesnesidir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nested sorgu koşulu
request.searchQuery.query parametresi aşağıdaki parametreleri içeren bir NestedQuery nesnesidir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Alt satır döndürme ayarları
request.searchQuery.query.innerHits parametresi aşağıdaki parametreleri içeren bir InnerHits nesnesidir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Döndürülen sütunlar
request.columnsToGet parametresi aşağıdaki parametreleri içeren bir SearchRequest.ColumnsToGet nesnesidir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dönüş değerleri
Arama yanıtı
search yöntemi bir SearchResponse nesnesi döndürür. Aşağıdaki tabloda temel alanlar açıklanmaktadır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Arama eşleşmesi
response.searchHits[] dizisi aşağıdaki temel alanları içeren bir SearchHit nesnesinden oluşur.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nested eşleşmesi
response.searchHits[].searchInnerHits aşağıdaki alanlara sahip SearchInnerHit değerlerini içerir.
|
|
|
|
|
|
|
|
|
|
|
|
Senaryo örnekleri
Çok düzeyli bir nested alanı sorgulama
Çok düzeyli bir nested alanı sorgulamak için path parametresini hedef nested alanın tam yoluna ayarlayın ve alt sorguda tam alt alan yolunu belirtin. Aşağıdaki örnek, items.details.name değerinin beta olduğu satırları sorgular.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.details.name");
termQuery.setTerm(ColumnValue.fromString("beta"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items.details");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Aynı alt satırın birden fazla koşulu karşılamasını zorunlu kılma
Birden fazla alt koşulu içeren bir BoolQuery nesnesini tek bir NestedQuery içinde alt sorgu olarak ayarlayın. Aşağıdaki örnek, items içindeki aynı alt satırın items.keyword değerinin tablestore olmasını ve items.number alanının mevcut olmasını şart koşar.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
BoolQuery childQuery = new BoolQuery();
childQuery.setMustQueries(Arrays.asList(termQuery, existsQuery));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(childQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Farklı alt satırların birden fazla koşulu karşılamasına izin verme
Her koşul için birer NestedQuery oluşturun ve bu nested sorguları dış bir BoolQuery içinde birleştirin. Aşağıdaki örnek, items.keyword değerinin tablestore olması ile items.number alanının mevcut olmasının farklı alt satırlar tarafından karşılanmasına olanak tanır.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery termNestedQuery = new NestedQuery();
termNestedQuery.setPath("items");
termNestedQuery.setQuery(termQuery);
termNestedQuery.setScoreMode(ScoreMode.None);
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
NestedQuery existsNestedQuery = new NestedQuery();
existsNestedQuery.setPath("items");
existsNestedQuery.setQuery(existsQuery);
existsNestedQuery.setScoreMode(ScoreMode.None);
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(
Arrays.asList(termNestedQuery, existsNestedQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Eşleşen alt satırları döndürme ve vurgulama
Eşleşen alt satırların sayısını, sıralama düzenini ve vurgulama ayarlarını yapılandırmak için InnerHits kullanın. Aşağıdaki örnek, items.description alanı hangzhou içeren alt satırları sorgular ve vurgulanmış sonuçları döndürür.
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("items.description");
matchQuery.setText("hangzhou");
HighlightParameter parameter = new HighlightParameter();
parameter.setPreTag("<em>");
parameter.setPostTag("</em>");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("items.description", parameter);
InnerHits innerHits = new InnerHits();
innerHits.setLimit(3);
innerHits.setSort(new Sort(Arrays.asList(
new ScoreSort(), new DocSort(SortOrder.ASC))));
innerHits.setHighlight(highlight);
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(matchQuery);
nestedQuery.setScoreMode(ScoreMode.None);
nestedQuery.setInnerHits(innerHits);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Çok düzeyli bir nested sorguda, eşleşen alt satırların döndürülmesi veya vurgulanması gereken her NestedQuery düzeyinde innerHits yapılandırın.