Up to 120% better keyword search quality with the right language analyzer in Azure AI Search
By Abhishree Shetty, Alec Berntson, Lihang Li
A language analyzer is a specific type of text analyzer that performs lexical analysis using the linguistic rules of the target language. It applies language-specific rules to convert raw text chunks into searchable terms, handling aspects like word boundaries, word forms, and compound words.
If you build search experiences on Azure AI Search, the analyzer you choose directly affects the quality of keyword search results. Azure AI Search offers Lucene and Microsoft language analyzers covering 50+ languages, but there has been no systematic guidance on which to use or whether they matter at all.
We compared Lucene, Microsoft, and no analyzer across 20 languages and 3 datasets. This post covers what we found, how customers use analyzers today, why results differ between Lucene and Microsoft, and how to pick the right one for your content.
TL;DR
- Always use a language analyzer. +15% NDCG on average, up to +120% for morphologically complex languages.
- Lucene and Microsoft are both strong. Differences are small; Microsoft has broader language coverage.
- No latency penalty. Analyzer choice does not affect query search performance.
- Some languages have a clear preference. For example, German and Spanish consistently favor Lucene, while Chinese favors Microsoft. Read the post for complete per-language breakdown.
Table of Contents
- What Does a Language Analyzer Do?
- Does It Even Matter?
- What Do Customers Actually Do Today?
- Lucene vs Microsoft — The Full Picture
- Under the Hood — Why Results Differ
- Is There a Latency Cost during Search?
- Practical Recommendations
- Key Takeaways
- Appendix A: Datasets and Methodology
- Appendix B: Detailed Results Per Dataset
What Does a Language Analyzer Do?
By default, Azure AI Search uses a standard tokenizer that splits text on whitespace and punctuation and lowerscases everything. It has no understanding of language. A language analyzer adds linguistic intelligence to this process:
Segmentation — Identifying word boundaries in languages that lack whitespace:
서울에서 맛있는 음식점 추천해주세요 → 서울 / 맛있 / 음식점 / 추천
Lemmatization — Reducing inflected words to their base form:
fuimos, vamos, yendo → ir
Compound decomposition — Breaking compound words into meaningful parts:
Krankenhausverwaltungssystem → Kranken + haus + verwaltung + system
Azure AI Search supports the following analyzer options:
|
Option |
What it does |
Languages |
|
None (default) |
Apache Lucene Standard Analyzer. Performs whitespace + punctuation splitting, lowercase. No linguistic processing. |
N/A |
|
Lucene |
Open-source Apache Lucene language analyzers. Faster. Use stemming and stopword removal. |
~35 |
|
Microsoft |
Proprietary Microsoft NLP technology (used in Office and Bing). Advanced capabilities including lemmatization, word decompounding, and entity recognition. |
50+ |
|
Custom |
User-defined combination of tokenizer, token filters, and character filters. |
Any |
Table 1: Language analyzer options in Azure AI Search
Here is how the three built-in options processes text across different languages:
|
Language |
Input |
None |
Lucene |
Microsoft |
|
English |
items in conflict and did not sync |
items, in, conflict, and, did, not, sync |
item, conflict, did, sync |
item, items, conflict, do, did, synch, sync |
|
English |
Change display settings and brightness on Windows 11 |
change, display, settings, and, brightness, on, windows, 11 |
chang, displai, set, bright, window, 11 |
change, display, setting, settings, brightness, window, windows, 11 |
|
Korean |
서울에서 맛있는 음식점 추천해주세요 |
서울에서, 맛있는, 음식점, 추천해주세요 |
서울, 울에, 에서, 맛있, 있는, 음식, 식점, 추천, ... |
서울에서, 서울, 맛있는, 음식점, 음식, 추천해주세요, 추천, 주세요 |
|
Spanish |
Los usuarios no pueden iniciar sesión |
los, usuarios, no, pueden, iniciar, sesión |
usuari, pueden, iniciar, sesion |
usuario, usuarios, no, poder, pueden, iniciar, sesion, sesión |
|
Swedish |
Snabbstart fungerar inte från datorn |
snabbstart, fungerar, inte, från, datorn |
snabbstart, funger, datorn |
snabbstart, snabb, start, fungera, fungerar, inte, från, dator, datorn |
Table 2: How each analyzer tokenizes the same input text
The tokens in Table 2 were generated using Azure AI Search Analyze API. You can try it yourself with your own text.
Does It Even Matter?
Out of 31 language–dataset combinations we tested, the standard tokenizer (None) never won. In every case, a language analyzer delivered better results.
|
Strategy |
Avg NDCG@10 |
vs None |
|
Microsoft |
0.4252 |
+15.4% |
|
Lucene |
0.4177 |
+13.4% |
|
None |
0.3684 |
baseline |
Table 3: Average NDCG@10 across all 31 language–dataset combinations
Improvements vary by language. Some see massive lifts; others see modest gains:
|
Language |
Dataset |
Best Analyzer |
NDCG@10 (Best) |
NDCG@10 (None) |
Lift |
|
Finnish |
Support |
Microsoft |
0.2752 |
0.1253 |
+119.6% |
|
Korean |
Support |
Lucene |
0.3252 |
0.1520 |
+113.9% |
|
Polish |
Support |
Microsoft |
0.2759 |
0.1611 |
+71.3% |
|
Spanish |
Support |
Lucene |
0.2469 |
0.1596 |
+54.7% |
|
Korean |
MIRACL |
Microsoft |
0.6895 |
0.4624 |
+49.1% |
|
Japanese |
MIML |
Lucene |
0.5348 |
0.3806 |
+40.5% |
|
Chinese |
MIML |
Microsoft |
0.5668 |
0.4292 |
+32.1% |
Table 4: Languages with the largest retrieval quality lift from using a language analyzer
Morphologically complex languages (Finnish, Korean, Polish) benefit the most — lifts exceed +70%. CJK languages also see large gains because they lack whitespace word boundaries. But the lift extends well beyond these: Arabic (+34%), Spanish (+55%), French (+18%), and Turkish (+14%) all see double-digit improvements. Even English on well-formatted content shows a +5.9% lift (MIML). On enterprise support content, the lift grows to +14.1%.
Key takeaway: Always use a language analyzer.
What Do Customers Actually Do Today?
We examined analyzer usage across Azure AI Search indexes.
|
Metric |
Value |
|
Indexes using any language analyzer |
27.8% |
|
Microsoft-only share (among those who use one) |
64.8% |
|
Lucene-only share |
31.2% |
|
Mixed (both) share |
4.0% |
Table 5: Language analyzer adoption metrics
Among customers who do use an analyzer, behavior largely aligns with study findings:
- French: Customers favor Lucene, consistent with our results.
- Korean: Customers favor Microsoft, also consistent.
- English: Customers lean Microsoft (68.4%). Our study shows Microsoft wins 2 of 3 datasets for English, consistent with this preference.
Key takeaway: Most customers today don't use a language analyzer.
Lucene vs Microsoft — The Full Picture
|
Analyzer |
Wins (of 31) |
% of Optimal NDCG@10 |
|
Microsoft |
17 |
96.7% |
|
Lucene |
14 |
95.0% |
|
None |
0 |
86.8% |
Table 6: NDCG@10 wins by analyzer across all 31 combinations
Microsoft wins more combinations overall, but the differences are often small. Here are some examples:
- English: Microsoft 0.9413 vs Lucene 0.9383 — difference of 0.0030
- Chinese: Microsoft 0.5668 vs Lucene 0.5646 — difference of 0.0022
From the Support dataset:
- Danish: Microsoft 0.3044 vs Lucene 0.3028 — difference of 0.0016
- Korean: Lucene 0.3252 vs Microsoft 0.3218 — difference of 0.0034
There is no meaningful quality difference between these two.
Language coverage
Microsoft analyzers support 50 languages; Lucene supports ~35. For 20+ languages, Microsoft is the only option: Croatian, Estonian, Gujarati, Hebrew, Hindi, Icelandic, Kannada, Latvian, Lithuanian, Malayalam, Malay, Marathi, Punjabi, Serbian, Slovak, Slovenian, Tamil, Telugu, Ukrainian, Urdu, and Vietnamese.
Corpus type effects
We define two content categories:
- Clean text: Well-formatted, edited content — academic papers, Wikipedia articles, curated knowledge bases. Minimal typos, consistent structure.
- Noisy text: User-generated or operational content — support tickets, short queries, product forums. Frequent typos, mixed languages, informal grammar.
The choice between Lucene and Microsoft depends on which type your content resembles:
|
Dataset |
Content Type |
Lucene Wins |
Microsoft Wins |
None Wins |
Lucene Avg. NDCG |
Microsoft Avg. NDCG |
|
MIML |
Clean, multilingual multidomain docs |
4/6 |
2/6 |
0/6 |
0.6845 |
0.6359 |
|
MIRACL |
Clean, Wikipedia passages |
5/7 |
2/7 |
0/7 |
0.6444 |
0.6425 |
|
Support |
Noisy, Support tickets |
5/18 |
13/18 |
0/18 |
0.2406 |
0.2705 |
Table 7: Analyzer performance by content type
On clean data, Lucene has an edge (+7.6% average NDCG over Microsoft on MIML). On noisy data, Microsoft wins decisively — 13 of 18 languages, with +12.4% higher average NDCG than Lucene.
Under the Hood — Why Results Differ
The core difference is their approach to morphological analysis.
Lucene
Lucene language analyzers reduce words to short stems using rule-based algorithms (Porter, Snowball). By collapsing inflected forms to a common root, stemming increases recall — a query for attach will match documents containing attachments, attached, or attaching. This is particularly effective on clean, well-structured text where broader matching helps surface relevant content.
The tradeoff is precision. On noisy text, stemming can be too aggressive:
|
Input |
Lucene token |
Effect |
|
settings |
set |
Broader matching, but also collides with set, setup, setter |
|
brightness |
bright |
Matches more variants, but loses the specific noun form |
|
attachments |
attach |
Good for recall, but pulls in loosely related content |
|
Windows (Polish) |
winc |
Proper noun mangled by language-specific stemming rules |
Table 8: Examples of Lucene stemming behavior
Microsoft
Microsoft analyzers preserve the original term and add normalized variants — for example, settings yields both settings and setting. This gives recall benefits similar to stemming while keeping the original form available for precise matching.
Microsoft analyzers also:
- Preserve proper nouns: Windows stays Windows rather than being stemmed
- Decompose compounds: Swedish snabbstart → snabb + start
- Retain more stopwords: Where Lucene removes functional words like in, not, and, Microsoft keeps more of them
Comparing on noisy text
Consider a typical support query: "how to fix Windows settings not responding after update"
- None (9 tokens): how, to, fix, windows, settings, not, responding, after, update
- Lucene (7 tokens): how, fix, window, set, respond, after, updat — drops to, not, windows; collapses settings → set and update → updat
- Microsoft (10 tokens): how, fix, window, windows, setting, settings, respond, responding, after, update — keeps originals and adds normalized forms
Lucene loses not (negation context) and settings becomes the generic set. Microsoft preserves the original terms and adds variants, keeping the query's meaning intact.
On clean text, Lucene's stemming is mostly beneficial — broader matching helps recall. On noisy text, the same aggressiveness can compound the problem, which is why Microsoft tends to perform better on noisy data.
Is There a Latency Cost during Search?
Language analyzers run at both index time and query time, but the heavier processing happens during indexing. At query time, all three options produce identical p50 and p95 latency. We verified this across multiple languages under concurrent load. Your choice of analyzer will not affect search performance.
Practical Recommendations
Decision framework
Figure 1: Decision framework for choosing a language analyzer in Azure AI SearchLanguage-specific overrides
For three languages, our data is consistent across all datasets tested:
|
Language |
Recommended |
Evidence |
Avg NDCG Margin |
|
German (de) |
Lucene |
Wins 2/2 datasets (MIML, Support) |
+0.042 |
|
Spanish (es) |
Lucene |
Wins 3/3 datasets (MIML, MIRACL, Support) |
+0.040 |
|
Chinese (zh) |
Microsoft |
Wins 2/2 datasets (MIML, Support) |
+0.010 |
Table 9: Languages with a consistent analyzer preference across all datasets tested
For other languages, the best choice depends on your content type — Lucene tends to win on clean data, Microsoft on noisy data.
Note: These results are based on our three test datasets. We recommend validating your own data using the Analyze API.
Key Takeaways
- Always configure a language analyzer. The biggest gain comes from using any analyzer vs None (+15% average). The Lucene-vs-Microsoft difference is secondary.
- Both Lucene and Microsoft are safe choices. Always-Lucene captures 95.0% of optimal NDCG; Always-Microsoft captures 96.7%.
- There is no latency penalty. Analyzer choice does not affect query performance.
- Use per-field analyzers for multilingual indexes. Each language field should use its own analyzer for best results.
- Microsoft is the broader default. 50 languages, meaning-preserving normalization, and the only option for 20+ languages.
Appendix A: Datasets and Methodology
Datasets
We evaluated across three datasets chosen for their diversity in content type, language coverage, and query difficulty:
|
Dataset |
Content Type |
Languages |
Queries |
Source |
|
MIML |
Multilingual industry documents across 10 domains (accounting, banking, government, healthcare-admin, healthcare-research, HR, industrial, insurance, legal, product-manuals) |
6 (de, en, es, fr, ja, zh) |
12,970 |
Internal curated dataset with chunked documents (1024-token chunks) |
|
MIRACL |
Wikipedia passages across languages |
7 (ar, en, es, fr, ja, ko, ru) |
1,750 |
MIRACL benchmark — widely used multilingual IR benchmark |
|
Support |
Real Microsoft support tickets and knowledge base articles |
18 (ar, da, de, en, es, fi, fr, it, ja, ko, nb, nl, pl, pt, ru, sv, tr, zh) |
16,178 |
Microsoft Support corpus with Bing-sourced queries |
Table 10: Datasets used in this study
Hole filling
In all three datasets, top-10 retrieved documents often include unjudged items ("holes"). We used GPT-4o to fill these holes: for each unjudged document, the model rates relevance on a 0–4 scale (ABYSMAL to IDEAL). Documents rated ≥ 2 (FAIR) are counted as relevant. This ensures NDCG@10 is computed over a complete set of judgments rather than penalizing unjudged documents.
Metric
We use NDCG@10 (Normalized Discounted Cumulative Gain at rank 10) as the primary metric throughout this post. It measures ranking quality — whether the most relevant documents are ranked highest in the top-10 results.
Experiment setup
- 93 experiments: 31 language–dataset combinations × 3 analyzer types (None, Lucene, Microsoft)
- Search service: Azure AI Search (BM25 retrieval, top-10 results)
- Evaluation: Per-query metrics with paired statistical significance testing (t-test + Wilcoxon signed-rank)
Appendix B: Detailed Results Per Dataset
MIML (6 languages, 12,970 queries)
|
Language |
Queries |
Lucene |
Microsoft |
None |
Winner |
Margin |
|
de |
2,462 |
0.6858 |
0.6087 |
0.6170 |
Lucene |
+0.069 |
|
en |
1,493 |
0.9383 |
0.9413 |
0.8888 |
Microsoft |
+0.003 |
|
es |
2,205 |
0.6631 |
0.5767 |
0.6107 |
Lucene |
+0.052 |
|
fr |
2,199 |
0.7203 |
0.6106 |
0.6126 |
Lucene |
+0.108 |
|
ja |
2,406 |
0.5348 |
0.5112 |
0.3806 |
Lucene |
+0.024 |
|
zh |
2,205 |
0.5646 |
0.5668 |
0.4292 |
Microsoft |
+0.002 |
Table 11: MIML: NDCG@10 per language and analyzer
MIRACL (7 languages, 1,750 queries)
|
Language |
Queries |
Lucene |
Microsoft |
None |
Winner |
Margin |
|
ar |
250 |
0.7008 |
0.6876 |
0.6284 |
Lucene |
+0.013 |
|
en |
250 |
0.6334 |
0.6213 |
0.5963 |
Lucene |
+0.012 |
|
es |
250 |
0.6305 |
0.6120 |
0.5613 |
Lucene |
+0.018 |
|
fr |
250 |
0.6515 |
0.6246 |
0.5745 |
Lucene |
+0.027 |
|
ja |
250 |
0.6589 |
0.6772 |
0.6525 |
Microsoft |
+0.018 |
|
ko |
250 |
0.6327 |
0.6895 |
0.4624 |
Microsoft |
+0.057 |
|
ru |
250 |
0.6033 |
0.5850 |
0.5120 |
Lucene |
+0.018 |
Table 12: MIRACL: NDCG@10 per language and analyzer
Support (18 languages, 16,178 queries)
|
Language |
Queries |
Lucene |
Microsoft |
None |
Winner |
Margin |
|
ar |
772 |
0.2619 |
0.2791 |
0.2080 |
Microsoft |
+0.017 |
|
da |
293 |
0.3028 |
0.3044 |
0.2505 |
Microsoft |
+0.002 |
|
de |
2,691 |
0.2223 |
0.2156 |
0.2113 |
Lucene |
+0.007 |
|
en |
1,000 |
0.1065 |
0.2122 |
0.1860 |
Microsoft |
+0.026 |
|
es |
1,000 |
0.2469 |
0.2329 |
0.1596 |
Lucene |
+0.014 |
|
fi |
129 |
0.2522 |
0.2752 |
0.1253 |
Microsoft |
+0.023 |
|
fr |
1,000 |
0.1954 |
0.2726 |
0.2241 |
Microsoft |
+0.049 |
|
it |
1,000 |
0.2924 |
0.2799 |
0.2772 |
Lucene |
+0.013 |
|
ja |
1,000 |
0.3127 |
0.3329 |
0.2922 |
Microsoft |
+0.020 |
|
ko |
1,000 |
0.3252 |
0.3218 |
0.1520 |
Lucene |
+0.003 |
|
nb |
226 |
0.2464 |
0.2722 |
0.2383 |
Microsoft |
+0.026 |
|
nl |
1,000 |
0.2677 |
0.2403 |
0.2482 |
Lucene |
+0.019 |
|
pl |
526 |
0.1587 |
0.2759 |
0.1611 |
Microsoft |
+0.115 |
|
pt |
1,000 |
0.2222 |
0.2349 |
0.1914 |
Microsoft |
+0.013 |
|
ru |
1,000 |
0.2731 |
0.2916 |
0.2739 |
Microsoft |
+0.018 |
|
sv |
541 |
0.1744 |
0.2961 |
0.2502 |
Microsoft |
+0.046 |
|
tr |
1,000 |
0.2412 |
0.2848 |
0.2504 |
Microsoft |
+0.034 |
|
zh |
1,000 |
0.2281 |
0.2461 |
0.1952 |
Microsoft |
+0.018 |
Table 13: Support: NDCG@10 per language and analyzer